• 几个最大子字符串的算法题


    ××××××××××××××××××××××××××××××××××

    统计一个字符串中所有字符出现的次数

    基本思路:建立一个访问标志数组,初始化为访问次数0,每访问一次,将其增1:

    static int count[128];

    遍历字符串数组,每次读取一个字符ch; count[ch]++; 这样只要遍历一次数组就行了。在最后把count[i]==0的去掉即可

    #include <iostream>

    using namespace std;

    int main()

    {

    int count[255] ={0};

    char *pstrTemp = "243567867867867";

    do

    {

    count[*pstrTemp]++;

    }while (*(++pstrTemp));

    for(int i = 0; i < 255; ++i)

    {

    if (count[i] != 0)

    cout << "character:" << (char)i <<" number:" << count[i] << endl;

    }

    }

    ××××××××××××××××××××××××××××××××××

    求最大的相同字符子串(由同一个字符组成)

    不处理相同最大字符串的情况,可处理仅一个字符的情况。求出每个字母对应的最长字串

    默认为只处理大写字母,否则可以将26更改为128即可

    void ddStrSame(char * ch)

    {

    int TempCH[26];

    int i,MaxLen =1,count=1;

    char Curchar;

    for(i=0;i<26;i++) // 将每个字符的初始访问次数置为0

    TempCH[i] = 0;

    //第一个应单独处理,防止下面越界

    TempCH[*ch-0x61]++;

    Curchar = *ch++; // 若字符串只有一个字符时,此时很重要

    while(*ch != '/0')

    {

    // 与上一个相同时,增加计数1,若不同,则更新当前字符的最大访问次数

    if(*ch == *(ch-1)) //

    {

    count++;

    }

    else

    {

    if( count > TempCH[*(ch-1)-0x61])

    {

    TempCH[*(ch-1)-0x61] = count;

    if(MaxLen < count) // 当前字符的最大计数大于所有字符中的最大计数,则/更新最大计数及对应的字符

    {

    MaxLen = count;

    Curchar = *(ch-1);

    }

    }

    count = 1; // 以便对下一个字符计数

    }

    ch++;

    }

    if( count > TempCH[*(ch-1)-0x61])

    {

    TempCH[*(ch-1)-0x61] = count;

    if(MaxLen < count) // 当前字符的最大计数大于所有字符中的最大计数,则/更新最大计数及对应的字符

    {

    MaxLen = count;

    Curchar = *(ch-1);

    }

    }

    printf("Character = %c/tNumber = %d/n",Curchar,MaxLen);

    }

    void main()

    {

    ddStrSame("b");

    ddStrSame("abcdddddaaaaabbbeefffda");

    ddStrSame("aabcdddaaaaabbbeefffda");

    ddStrSame("aaaaaabcdddaaaaabbbeefffda");

    ddStrSame("aaabcdddaaaaabbbeefffdaaaaaa");

    ddStrSame("aaabcdddaaaaabbbeeffffffffffffdaaaaaab");

    system("pause");

    }

    ××××××××××××××××××××××××××××××××××

    写一个函数,它的原形是int FindMaxIntStr(char *outputstr,char *intputstr)

    功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789

    // 不处理含相同长度的最长子串,若有,则返回的是第一次出现的最长字串

    int FindMaxIntStr (char *outputstr, char *inputstr)

    {

    char *in = inputstr, *out = outputstr, *temp, *final;

    int count = 0, maxlen = 0;

    while( *in != '/0' )

    {

    if( *in >= ‘0’ && *in <= ‘9’ )

    {

    for(temp = in; *in >= ‘0’ && *in <= ‘9’; in++ )

    count++;

    if( maxlen < count )

    {

    maxlen = count;

    //count = 0;

    final = temp; // temp保存了当前连续最长字串的首地址,final是总的最长

    *(final+count) = ‘/0’; // 给字符串赋上结束符

    }

    count = 0; // 不管当前累计的最长数字是否大于前面最长的,都应该清除count,以便下/次计数

    }

    //else 不管上面的if是否进入,到此处时*in肯定不是数字

    in++;

    }

    // 上述比较过程只保存了最长字串在输入数组中对应的地址,避免了反复拷贝到输出数组/的过程

    for(int i = 0; i < maxlen; i++) // 将最终的最长字串保存到输出数组

    {

    *out++ = *final++;

    }

    *out = '/0';

    return maxlen;

    }

    int main()

    {

    char input[] = "abcd12345ed125ss0123456789";

    char output[50] = {0};

    unsigned int maxlength = FindMaxIntStr (output, input);

    cout << output <<endl <<maxlength<<endl;

    return 0;

    }

    ××××××××××××××××××××××××××××××××××

  • 相关阅读:
    JVM运行时数据区与JVM堆内存模型小结
    Java Management Extensions (JMX)
    ubuntu 中 搭建 C编程环境
    个人使用的电脑软件
    Navicat Premium 12 安装 与 激活
    利用 canvas 实现压缩图片
    barcode模块: plus.barcode.scan 进行扫描图片出现无法识别二维码,打印的错误信息是code:8,message:''
    win10 出现 No AMD graphics driver is installed or the AMD driver is not functioning properly .....
    H5项目 使用Cropper.js 实现图片 裁剪 操作 (APP端)
    Java 正则表达式获取两个字符中间的内容
  • 原文地址:https://www.cnblogs.com/xmphoenix/p/2257708.html
Copyright © 2020-2023  润新知