求字符串中重复字符的最大间隔

思路:

定义两个指针pStr1和pStr2分别指向字符串的头和尾。定义map<char,int> strMap,保存字符和对应的最大间隔。保持pStr1不变,如果pStr1和pStr2指向的字符相等,则在strMap中保存strMap[str[pStr1]] = pStr2 - pStr1; 否则pStr2递减直到终止条件pStr1 < pStr2。注意每次遍历前都要判断str[pStr1]是否在strMap中,如果在的话就直接进入下一个循环。最后遍历strMap,找出最大的value值。


/* 求字符串中重复字符最大的间隔*/
#include <stdio.h>
#include <iostream>
#include <string>
#include <map>

using namespace std;

int GetMaxInterval(string str);

int main()
{
	string str;
	while (str != "exit")
	{
		cout << "input string:";
		//cin >> str;  //不包含空格
		getline(cin, str);  //包含空格
							//cout << str;
		cout << "Max interval is: " << GetMaxInterval(str) << endl;
	}
		
	system("pause");
	return 0;
}

int GetMaxInterval(string str)
{
	int lenStr = str.length();
	//cout << lenStr << endl;
	if (lenStr <= 1)
		return 0;
	//int pStr1 = 0;
	int pStr2 = lenStr - 1;
	map<char, int> strMap;
	map<char, int>::iterator iter;
	for (int pStr1 = 0; pStr1 < lenStr - 1; ++pStr1)
	{
		iter = strMap.find(str[pStr1]);
		if (iter == strMap.end())  //strMap中没有键存在
		{
			while (pStr1 < pStr2)
			{
				if (str[pStr1] == str[pStr2])  //找
				{
					strMap[str[pStr1]] = pStr2 - pStr1;				
					break;
				}
				pStr2 -= 1;
			}
			pStr2 = lenStr - 1;
		}	
	}
	int result = 0;
	for (iter = strMap.begin(); iter != strMap.end(); ++iter)
	{
		if ((iter->second) > result)
		{
			result = iter->second;
		}
	}
	return result;
}


### 查找字符串中出现次数多的子串 为了查找字符串中出现次数多的子串,可以采用基于后缀数组的方法。这种方法不仅能够高效解决问题,还具有较高的准确性。 对于给定的字符串 `s` ,构建其所有可能的后缀并形成后缀数组。例如,在字符串 `"abababc"` 中,生成如下所示的后缀数组: - abababc - bababc - ababc - babc - abc - bc - c 通过观察这些后缀,可以看出某些模式会多次出现。具体来说,当某个子串首次出现在位置 `i` 的前缀处时,如果该子串再次出现,则会在索引 `i + len(substring)` 处找到相同的前缀[^1]。 #### 实现算法的关键在于以下几个方面: 1. **构建后缀数组** 使用高效的排序算法对所有的后缀进行字典序排列。这一步骤有助于快速定位相同或相似的子串。 2. **计算高度数组** 高度数组记录相邻两个后缀之间的长公共前缀长度。这对于识别重复出现的子串至关重要。 3. **寻找高频次的子串** 结合后缀数组和高度数组的信息,遍历整个列表以发现那些频繁重现的片段。特别注意的是,这里关注的是连续出现而非间隔分布的情况。 下面是一个简单的 Python 函数用于演示这一过程: ```python def find_most_frequent_substring(text): n = len(text) # 构建后缀及其对应的原始索引 suffixes = [(text[i:], i) for i in range(n)] # 对后缀按字典顺序排序 suffixes.sort() count_map = {} max_count = 0 result = "" for i in range(len(suffixes)-1): current_suffix = suffixes[i][0] next_suffix = suffixes[i+1][0] common_prefix_length = 0 min_len = min(len(current_suffix),len(next_suffix)) for j in range(min_len): if current_suffix[j]!=next_suffix[j]: break common_prefix_length += 1 prefix_str=current_suffix[:common_prefix_length] if not prefix_str: continue if prefix_str in count_map: count_map[prefix_str]+=1 else: count_map[prefix_str]=1 if count_map[prefix_str]>max_count and common_prefix_length>0 : max_count=count_map[prefix_str] result=prefix_str return f'常出现的子串是 "{result}" ,共出现了 {max_count} 次' ``` 此函数首先创建了一个包含所有后缀以及它们原来的位置的元组列表,并对其进行排序。接着比较每一对相邻的后缀来确定共同前缀的大长度。后统计各子串出现频率并将结果返回。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值