求字符串中连续出现次数最多的子串

来源:互联网 发布:陕西水利预算软件 编辑:程序博客网 时间:2024/06/08 06:21

方法一:

/*基本算法描述: 
给出一个字符串abababa 
1.穷举出所有的后缀子串 
substrs[0] = abababa; 
substrs[1] = bababa; 
substrs[2] = ababa; 
substrs[3] = baba; 
substrs[4] = aba; 
substrs[5] = ba; 
substrs[6] = a; 
2.然后进行比较 
substrs[0]比substrs[1]多了一个字母,如果说存在连续匹配的字符,那么 
substrs[0]的第1个字母要跟substrs[1]首字母匹配,同理 
substrs[0]的前2个字母要跟substrs[2]的前2个字母匹配(否则不能叫连续匹配) 
substrs[0]的前n个字母要跟substrs[n]的前n个字母匹配. 
如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串. 
*/

复制代码
int count = 0; char sub_str[256]; void find_str(char *str) {      int str_len = strlen(str);      int i, j, k;      int tmp_cnt = 0;       for (i = 0; i < str_len; i++)      {          for (j = i+1; j < str_len; j++)          {              int n = j-i;                         //sub string length              tmp_cnt = 1;              if (strncmp(&str[i], &str[j], n) == 0)   //compare n-lengths strings              {                  tmp_cnt++;                          //they are equal, so add count                  for (k = j+n; k < str_len; k += n)  //consecutive checking                  {                      if (strncmp(&str[i], &str[k], n) == 0)                      {                          tmp_cnt++;                      }                      else                          break;                  }                  if (count < tmp_cnt)                  {                      count = tmp_cnt;                      memcpy(sub_str, &str[i], n); //record the sub string                  }              }          }       }  } 

方法二:

#include<iostream>

#include <string>
#include <vector>
#include <map>


using namespace std;
pair<int,string> fun(const string &str)
{
vector<string> substrs;
int maxcout=1,count =1;
string substr;
int i,len = str.length();

for(i =0;i<len;++i)

{

substrs.push_back(str.substr(i,len-i));//  把abcbcabc,bcbcabc,cbcabc, bcabc,cabc,abc,bc,c一次放入容器中

}
       for(i =0;i<len;i++)
{
for(int j =i+1;j<len;j++)
{
count =1;
if(substrs[i].substr(0,j-i)==substrs[j].substr(0,j-i))//第一次循环先单个字符比较,然后再两个,三个字符比较
{
++count;
for(int k =j+(j-i);k<len;k +=j-i)
{
if(substrs[i].substr(0,j-i)==substrs[k].substr(0,j-i))//如果前面比较成功,则需要后面跳跃处理
++count;
else
break;
}
if(count>maxcout)
{
maxcout =count;
substr =substrs[j].substr(0,j-i);
}
}
}
}
return make_pair(maxcout,substr);
}





void main()
{
   //char *str="abababc";
   //find(str);
string str;
pair<int,string> rs;
while (cin>>str)
{
rs=fun(str);
        cout<<rs.second<<':'<<rs.first<<'\n';
}


}



方法三:java代码

/// <summary>
        /// 求出给定字符串的所有子串连续出现的次数
        /// </summary>
        public Dictionary<string,int>  GetSubstringDictionary(string str, List<string> substringSet)
        {
            Dictionary<string, int> dict = new Dictionary<string, int>();
            int num,numMAX;
            foreach (string s in substringSet)
            {
                num = 0;
                numMAX = 1;
                int firstIndex = str.IndexOf(s);//求出该子串在主串中第一次出现的位置
                for (int i = firstIndex; i < str.Length; )
                {
                    if (i + s.Length > str.Length)
                    {
                        //当前位置之后的字符串的长度已不满足所求字串的长度
                        break;
                    }
                    string tempStr = str.Substring(i, s.Length);
                    if (tempStr == s)
                    {
                        num++;
                        //判断字符串的前两个字符是否相同,若相同,i++,若不同i+当前查找字符串的长度
                        //例如,"cc"在字符串"ccc"中出现次数为2,"bc"在字符串"bcbc"出现次数为2的情况
                        string temp = s;
                        string firstChar = temp.Substring(0, 1);
                        if (temp.Remove(0,1).IndexOf(firstChar) == 0)
                        {
                            i++;
                        }
                        else 
                        {
                            i = i + s.Length;
                        }
            
                    }
                    else
                    {
                        //查找的字符串出现了不连续出现的情况,出现次数重置为1
                        num = 0;
                        i++;
                    }
                    //numMAX保存字符串出现的最大次数
                    if (num > numMAX)
                        numMAX = num;
                }
                dict.Add(s, numMAX);
            }
            return dict;
        }


/// <summary>
        /// 求出给出字符串的所有子串
        /// </summary>
        public List<string> GetSubString(string str)
        {
            if (str == null)
            {
                return null;
            }
            int length = str.Length;
            List<string> listOfSubstring = new List<string>();
            for(int i=1;i<=length;i++)
            {
                for (int j = 0; j < length; j++)
                {
                    if (i + j > length)
                    {
                        break;
                    }
                    else
                    {
                        string s = str.Substring(j, i);
                        if (!listOfSubstring.Contains(s))
                        {
                            listOfSubstring.Add(s);
                        }
                    }
                }
            }
            return listOfSubstring;
        }

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驼背怎么办要能快速矫正的方法 手臂往后扭后手臂根部疼又肿怎么办 一岁四个月宝宝有点斜颈怎么办? 六个月的宝宝脖子有点歪怎么办 情感交叉擦腿综合症心里治疗怎么办 坐月子受风了胳膊腿疼怎么办 劲椎手术两个月双腿疼痛麻这怎么办 手机里存的照片删除了怎么办 买了好几双鞋子都不防滑怎么办 电脑平车车加绒过厚不起线怎么办 碰见那种看不起人的店员应该怎么办 在食品厂上班載卫生帽头发痒怎么办 工司没给员工上保险离职后怎么办 货物被香港律政司扣了怎么办 室友考研要跟我考一样的学校怎么办 药流第一天才吃了一粒米非司怎么办 药流半月同房第二天大出血怎么办 口臭想让它变得不臭怎么办 来单位干了几天不满意想离职怎么办 药流吃药期间吃什么吐什么怎么办 养狗家里味道大怎么办养花有用吗 第一天上班站的脚疼怎么办 入职没有人事所需要的证书怎么办 入职第一天后不想去了怎么办 警察在执法过程中殴打群众怎么办 肾结石打了3天针痛得厉害怎么办 征兵体检过了到部队退兵怎么办 圆通快递要求退回结果被签收怎么办 新生儿蛋蛋淹了破皮了怎么办 要是和同学玩的时候打到睾丸怎么办 睾丸撞了一下里面碎了怎么办 睾丸被蚊子咬了挠坏流水疼怎么办 沐浴乳大量的灌注到尿道里怎么办 当电脑显示有文件损害时怎么办? 电脑上的压缩包手机上打不开怎么办 第五人格多酷账号退出了怎么办 更新显卡驱动时屏幕关闭了怎么办 不知道杯孕做了两次C丁怎么办 小说签约后更不到要求的字数怎么办 电脑中了感染病毒杀不干净怎么办 电脑下载的软件有病毒了怎么办