博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【字符串问题】求一个字符串中连续出现次数最多的子串
阅读量:7112 次
发布时间:2019-06-28

本文共 3177 字,大约阅读时间需要 10 分钟。

2013-09-14 10:47:39

在面试宝典上看到的题目,自己做了一下,用了C++中的string类,比较方便。

思路:

  1. 遍历源字符串的每一个字符,以该字符为首的重复子串的长度为1到以该字符为首的后缀字符串(即以该字符串为首,到字符结尾的子串,比如abdcef的第三个后缀字符串即为dcef)的长度的一半;
  2. 对所有的子串,判断连续重复出现的次数,如果子串连续重复出现的次数大于当前最大连续重复出现的次数,则更新最大连续重复出现的次数。

 

注意:

VC6.0 对C++的STL支持不是很好,有的方法不支持,如下面代码中的 srcStr.clear();在VS2008中可以运行无措,但在VC6.0中就会报错如下:

 error C2039: 'clear' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'

解决方法如下:

用可以完成相同功能的subStr.erase(0,subStr.length());替代,不会报错。

目前还没发现其他更好的办法,如有发现,还请分享一下哦!

 

代码如下(测试暂未发现错误,欢迎交流指正):

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 //对string类型,如何测试输入的有效性 8 size_t FindSubstrAppearMaxtimes(const string srcStr,string &subStr,size_t &count) 9 {10 count = 0;11 subStr.clear(); //或subStr.erase(0,subStr.length());12 13 string tmpStr;14 size_t tmpCount = 0;15 string tmpStrToComp;16 size_t posOfSubStr = 0;17 18 size_t srcEnd = srcStr.length();19 size_t srcCurIndex = 0;20 size_t subLen = 0;21 size_t subCurIndex = 0;22 23 while (srcCurIndex < srcEnd)24 {25 for (subLen = 1;2 * subLen <= srcEnd - srcCurIndex;++subLen)26 {27 tmpStr = srcStr.substr(srcCurIndex,subLen);28 tmpCount = 0;29 tmpStrToComp.erase(0,tmpStrToComp.length());30 31 for (subCurIndex = srcCurIndex;subCurIndex < srcEnd;subCurIndex += subLen)32 {33 tmpStrToComp = srcStr.substr(subCurIndex,subLen);34 if (tmpStr == tmpStrToComp) //要加string头文件,才能用==35 {36 ++tmpCount;37 }38 else39 {40 if (tmpCount > count)41 {42 posOfSubStr = srcCurIndex;43 count = tmpCount;44 subStr = tmpStr;45 }46 break;47 }48 }49 }50 51 ++srcCurIndex;52 }53 54 return posOfSubStr;55 }56 57 void TestDriver()58 {59 string strArray[] = {
"0123456","abcdef","abcbcbcedhellobc","abcbcbcabc","abcccabc"};60 size_t arrayLength = 5;61 62 string srcStr;63 string subStr;64 size_t count = 0;65 size_t posOfSubStr = 0;66 67 for (size_t index = 0;index < arrayLength;++index)68 {69 srcStr.clear();70 srcStr = strArray[index];71 posOfSubStr = FindSubstrAppearMaxtimes(srcStr,subStr,count);72 73 cout<<"the source string is : "<
<

测试结果:

the source string is : 0123456the sub string appear most frequently is : 0the appearance times is : 1the source string is : abcdefthe sub string appear most frequently is : athe appearance times is : 1the source string is : abcbcbcedhellobcthe sub string appear most frequently is : bcthe appearance times is : 3the source string is : abcbcbcabcthe sub string appear most frequently is : bcthe appearance times is : 3the source string is : abcccabcthe sub string appear most frequently is : cthe appearance times is : 3Press any key to continue

 

 

转载地址:http://syghl.baihongyu.com/

你可能感兴趣的文章
css加载会造成阻塞吗?
查看>>
由一个绝对定位引发overflow:auto滚动问题产生的关于包含块(containing block)的思考...
查看>>
CS-231N-斯坦福李飞飞机器视觉课(Cydiachen版笔记+感悟)
查看>>
推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
查看>>
聊聊storm TridentWindowManager的pendingTriggers
查看>>
React 解决fetch跨域请求时session失效
查看>>
翻译_只需20行代码创造JavaScript模板引擎(二)
查看>>
Blockchain和Tangle哪一个是未来?
查看>>
apicloud拉起小程序并传递参数
查看>>
虚拟机Centos6.8安装MYSQL5.7,本地Navicat连接
查看>>
简单聊聊DOM
查看>>
【JavaScript】JavaScript Array 对象(数组)
查看>>
github 上有趣又实用的前端项目(持续更新,欢迎补充)
查看>>
opencv python 直方图均衡化
查看>>
HotFrameLearning 热门框架学习(前言)
查看>>
git团队开发流程
查看>>
【Under-the-hood-ReactJS-Part6】React源码解读
查看>>
深入理解css之vertical-align
查看>>
Laravel事件
查看>>
matlab绘制peano(皮亚诺)曲线和koch(科赫曲线,雪花曲线)分形曲线
查看>>