求字符串中连续出现次数最多的子串
来源:互联网 发布:陕西水利预算软件 编辑:程序博客网 时间: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;
}
- 求字符串中连续出现次数最多的子串
- 求字符串中连续出现次数最多的子串
- 求字符串中出现次数最多且最长的子串、连续出现次数最多的子串
- 求一个字符串连续出现次数最多的子串
- 求一个字符串中连续出现并且出现次数最多的子串.
- 字符串---求一个字符串中连续出现次数最多的子串
- 求一个字符串中出现次数最多的子串(并不是连续的)
- 编程珠玑(四)求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串[C语言实现]
- 求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串
- 求一个字符串中连续出现的次数最多的子串
- 字符串中连续子串出现次数统计,获取连续出现次数最多的子串
- 找出字符串中连续出现次数最多的子串
- 字符串中连续出现次数最多的子串
- Android编译,打包、签名详细教程
- 去除unity3d的splash页面(remove unity3d splash image),在android中。
- mfc关闭js弹出框
- 场景切换,菜单界面
- 简单工厂VS工厂方法VS抽象工厂
- 求字符串中连续出现次数最多的子串
- android View 的组件内在区别
- 负载测试(Load Runner)
- Uva 299
- hdu 4770 Lights Against Dudely
- Ant
- Linux find查询最近更新访问过的文件
- 我的u3d学习之旅四
- VS2010 [warning C4996]: 'sprintf': This function or variable may be unsafe.