舉個例子說明一下:例如找到字符串mainStr="abcabcabcde"中連續出現次數最多的子串,可以看出"abc"出現3次,是出現次數最多的子串。對於該題可以用窮舉法,一一列舉每個子串連續出現的最大次數。
如下圖1,對於每一個子串都從當前位置i=pos1(子串開始位置)進行遍歷,其中j=pos2為子串結束的位置。那么offset=pos2-pos1即為當前子串的長度,如果mainStr.substr(i,offset) == mainStr.substr(j,offset)則按照該offset偏移量從k=pos2+offset處開始遍歷,每次增加offset個長度直至字符串結尾。當mainStr.substr(i,offset) == mainStr.substr(k,offset)時,表示出現連續相同的子串,否則break跳出當前循環。繼續從j+1位置處繼續循環執行。
看代碼:
void findMaxSubStr(const string& mainStr, string& maxSubStr,int &maxCounts) { int len = mainStr.length(); for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { int counts = 1; int offset = j - i; if (mainStr.substr(i, offset) == mainStr.substr(j, offset)) { counts++; } else continue; for (int k = j + offset; k < len; k += offset) { if (mainStr.substr(i, offset) == mainStr.substr(k, offset)) { counts++; } else break; } if (maxCounts < counts) { maxCounts = counts; maxSubStr = mainStr.substr(i, offset); } } } }




圖1
