寻找一个字符串中连续出现次数最多的子串


算法描述
首先获得后缀数组,然后
1.第一行第一个字符a,与第二行第一个字符b比较,不等,则
2.第一行前两个字符ab,与第三行前两个字符cb比较,不等,则
3.第一行前三个字符abc,与第四行前三个字符bcb比较,不等,则
4.第一行前四个......
上述过程就相当于在原始字符串中,
第一趟,a与b比较,ab与cb比较,abc与bcb比较,abcb与cbca比较,abcbc与bcabc比较,abcbcb与cabc比较......
第二趟,b与c比较,bc与bc比较(相等,则继续向后取长度为2的子串比较,碰到不等为止,本例中因碰到ab停止),bcb与cbc比较......
第三趟,c与b比较,cb与cb比较(相等),cbc与bca比较......
......
使用后缀数组方便编程实现






//vs2005
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <utility>
#include <string>
using namespace std;

pair<int,string> fun(const string &str)
{
	vector<string> substrs;
	int maxcount=1,count=1;
	string substr;
	int i,len=str.length();
	for(i=0;i<len;++i)
	{
		substrs.push_back(str.substr(i,len-i));
		cout<<substrs[i]<<endl;
	}
		
	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>maxcount)
				{
					maxcount=count;
					substr=substrs[i].substr(0,j-i);
				}
			}
		}
	}
	return make_pair(maxcount,substr);
}

int _tmain(int argc, _TCHAR* argv[])
{	string str;
	pair<int,string> rs;

	str="abcbcbcabc";
		rs=fun(str);
		cout<<rs.second<<':'<<rs.first<<endl;

	return 0;
}






 

在C语言,要找到一个字符串一个连续出现至少k次的字符,你可以使用滑动窗口和哈希表的方法。这里是一个简单的算法步骤: 1. 定义一个哈希表(或使用数组)来存储每个字符及其出现次数。 2. 遍历字符串,对于每个字符,检查它在哈希表出现次数是否大于等于k。 3. 如果找到满足条件的字符,更新窗口开始和结束的位置,直到窗口结束的位置移动,且新窗口内的字符出现次数仍然大于等于k。 4. 当遍历完整个字符串后,返回窗口的开始位置,即为第一个连续出现至少k次的字符的位置。 以下是一个简化的代码示例: ```c #include <stdio.h> #include <stdbool.h> #define MAX_CHAR 256 // 哈希表,记录字符和出现次数 int char_count[MAX_CHAR] = {0}; char start = -1; // 最初的起始位置 int k; // 更新字符计数 void update_char(char ch) { if (ch != '\0') { char_count[ch]++; if (char_count[ch] >= k) { start = (start == -1) ? 0 : start; } } else { // 如果遇到'\0',清空计数,寻找一个连续子串 for (int i = 0; i < MAX_CHAR; i++) { if (char_count[i] > 0) { char_count[i] = 0; if (start != -1; } } } } } // 主函数 int main() { const char *str = "abcccdeefgg"; int len = strlen(str); k = 3; // 设置查找的最小连续出现次数 for (int i = 0; i < len; i++) { update_char(str[i]); } if (start != -1) { printf("第一个连续出现至少 %d 次的字符 '%c' 的位置是 %d\n", k, str[start], start + 1); } else { printf("没有找到连续出现至少 %d 次的字符\n", k); } return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值