求字符串的最长不重复字串.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档