- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
求字符串的最长不重复字串
假设有一个字符串 “abcdebfgh”
那么最长不重复字串是 cdebfgh,长度是7
解题思路:
1、用一个二维数组 bits[26][2],存储每个字符ch(a-z)的信息。bits[ch-a][0]的值为0表示ch在字符串中还没有出现,为1表示已经出现过,bits[ch-a][1]存储字符ch在字符串中出现的位置;
2、maxLen记录最长不重复字串长度,初始为0;用start记录不重复字串(未必是最长的)的开始位置,left记录最长不重复字串的开始位置,right记录最长不重复字串的结束位置;
3、从字符串str中每读取一个字符ch,检测bits[ch-a][0]的值,是0,则该字符在字符串str中还没有出现过,bits[ch-a][0]置1,bits[ch-a][1]记录ch在str中的位置,不重复字串的长度加1,noRepeatSeqLen++;若是1,则检测到重复字符,start指向下一个字符的位置。若noRepeatSeqLen maxLen,就maxLen = noRepeatSeqLen,left = start, right = 当前字符位置? - start;
4、重复第3步,直到最后一个字符;
5、第4步循环结束后,再判断最后一个的非重复字符串是否最长非重复字符串,既,若noRepeatSeqLen maxLen,就maxLen = noRepeatSeqLen,left = start, right = 当前字符位置? - start。否则,直接返回maxLen。
/**求一个字符串的最长不重复字串
?* 例如字符串?abcdebfgh,则最长字串是cdebfgh
?* maxNoRepeatSeq(const char* str, int left, int right)
?* 返回值:最长不重复字串长度
?* left是最长不重复字串在原字符串中的开始位置
?* right是最长不重复字串在原字符串中的结束位置
?* 并输出最长不重复字符串
**/
#include?iostream
using?namespace?std;
int?maxNoRepeatSeq(const?char* str,?int?left,?int?right)
{
????char?bits[26][2]={0};
????int?start = 0;
????int?curr_pos = 0;
????int?maxLen = 0;
????int?noRepeatSeqLen = 0;
????while?(*str)
??? {
????????int?i = (int)(*str -?a);
????????if?(bits[i][0] == 0)//没有重复字符出现
??????? {
??????????? bits[i][0] = 1;
??????????? bits[i][1] = curr_pos;
??????????? noRepeatSeqLen++;
??????? }
????????else?//出现了重复字符
??????? {
????????????if?(noRepeatSeqLen maxLen)
???????????? {
??????????????? maxLen = noRepeatSeqLen;
??????????????? left = start;
??????????????? right = curr_pos - 1;
??????????? }
??????????? start = bits[i][1] + 1;?//记录非重复子串(未必是最长的)的开始位置
??????????? bits[i][1] = curr_pos;?//更新字符ch的位置信息
??????????? noRepeatSeqLen = curr_pos - start + 1;
????????????for?(int?k=0; k26; k++)//出现重复字符串后bits[i]要清零,再计算下一个串
??????????? {
??????????????? bits[k][0] = 0;
??????????? }
??????? }
??????? curr_pos++;
??????? str++;
??? }
????if?(noRepeatSeqLen maxLen)
??? {
??????? maxLen = noRepeatSeqLen;
??????? left = start;
??????? right = curr_pos - 1;
??? }
????return?maxLen;
}
int?main()
{
????const?ch
文档评论(0)