面試題 找出字串中連續出現次數最多的子串

2021-08-27 02:54:57 字數 3234 閱讀 3623

微軟的一道面試題:

如:abcbcbcabc,這個連續出現次數最多的字串是bc

一,考慮邊界問題。

二,實現優化笛卡爾積組合,

總體我是這樣想的:就是縱向切出字串的連續組合集合,在橫向一對一跳躍比較集合元素。

例如:abcbcabc

一,縱向切:

得到所有字串組合,注意:這裡要求的是最多連續子字串,其實就是優化笛卡爾積的原則,也是邊界。

字串共8位,以子串的長度為1,從字串第一位開始切,且稱為切:

1----從a開始切:(字串為abcbcabc )

第一次切出a子字串,得到: a和bcbcabc,

第二次切出ab子字串,得到: ab和cbcabc,

第三次切出abc子字串,得到: abc和bcabc,

第四次切出abcb子字串,得到: abcb和cabc,

第五次切出abcbc子字串,得到: abcbc和abc,

第六次切出abcbca子字串,得到: abcbca和bc,

第七次切出abcbcab子字串,得到: abcbcab和c,

第八次切出abcbcabc子字串,得到: abcbcabc,

得到a1集合陣列(且為陣列吧)

元素為:a, ab, abc, ......

2---再從b開始切::(字串為abcbcabc )

第一次切出b子字串,得到: b和cbcabc,

第二次切出bc子字串,得到: bc和bcabc,

第三次切出bcb子字串,得到: bcb和cabc,

第四次切出bcbc子字串,得到: bcbc和abc,

第五次切出bcbca子字串,得到: bcbca和bc,

第六次切出bcbcab子字串,得到: bcbcab和c,

第七次切出bcbcabc子字串,得到: bcbcabc

得到b2集合陣列(且為陣列吧)

元素為:b, bc, bcb ,......

3---再從c開始切: (字串為abcbcabc )

第一次切出c子字串,得到: c和bcabc,

第二次切出cb子字串,得到: cb和cabc,

第三次切出cbc子字串,得到: cbc和abc,

第四次切出cbca子字串,得到: cbca和bc,

第五次切出cbcab子字串,得到: cbcab和c,

第六次切出cbcabc子字串,得到: cbcabc

得到b3集合陣列(且為陣列吧)

元素為:c, cb, cbc ,......

4----再從b開始切: (字串為abcbcabc )

第一次切出b子字串,得到: b和cabc,

第二次切出bc子字串,得到: bc和abc,

第三次切出bca子字串,得到: bca和bc,

第四次切出bcab子字串,得到: bcab和c,

第五次切出bcabc子字串,得到: bcabc

得到b4集合陣列(且為陣列吧)

元素為:b, bc, bca ,......

5----再從c開始切: (字串為abcbcabc )

第一次切出c子字串,得到: c和abc,

第二次切出ca子字串,得到: ca和bc,

第三次切出cab子字串,得到: cab和c,

第四次切出cabc子字串,得到: cabc

得到c5集合陣列(且為陣列吧)

元素為:c, ca, cab ,......

6----再從a開始切: (字串為abcbcabc )

第一次切出a子字串,得到: a和bc,

第二次切出ab子字串,得到: ab和c,

第三次切出abc子字串,得到: abc,

得到a6集合陣列(且為陣列吧)

元素為:a, ab, abc

7----再從b開始切: (字串為abcbcabc )

第一次切出b子字串,得到: b和c,

第二次切出bc子字串,得到: bc,

得到b7集合陣列(且為陣列吧)

元素為:b, bc

8----再從c開始切: (字串為abcbcabc )

第一次切出c子字串,得到: c

得到c8集合陣列(且為陣列吧)

元素為:c

2,橫向比:

將a的所有切點按切的順序儲存到稱為a1集合陣列中(且為陣列吧)

將b的所有切點按切的順序儲存到稱為b2集合陣列中(且為陣列吧)

。。。依次類推到完。

得到如下8個集合:(字串為abcbcabc )

行數/列數 1 2 3 4 5 6 7 8

1 a1: a, ab, abc, abcb, abcbc, abcbca , abcbcab, abcbcabc;

2 b2: b, bc, bcb , bcbc, bcbca, bcbcab, bcbcabc;

3 c3: c, cb, cbc , cbca, cbcab, cbcabc ;

4 b4: b, bc, bca , bcab, bcabc;

5 c5: c, ca, cab , cabc;

6 a6: a, ab, abc ;

7 b7: b, bc;

8 c8: c;

將a1集合,b2集合。。。等全部集合橫向比較:

即將列1比較,列2比較跳躍1行比較,列3跳躍2行比較,列3跳躍3行比較。。。。到完;因為要求的是最多連續子字串,所以要跳躍!

得到相同字串記數最大值,即求出出現次數最多的子串。

比較方式:

正於前面所說,要求的是最多連續子字串。其實就是優化笛卡爾積的原則,也是邊界。所以我們要做的是將所有集合一對一比較,不是多對多或其他(更簡單的理由:位數不同,無需比較)。

多位子字串一對一比較時候,例如 ab屬於a集合和b集合的bc比較,顯然沒有意義。需要跳躍比較(且這樣說吧,呵呵)。跳躍是有規律的。很顯然就不說了。

之所以縱切,是為了解決橫比較帶來的優化問題

#include#include#includeusing namespace std;

pairfun(const string &str)

}} }

return make_pair(maxcount,substr);

}int main()

else

break;

} if (count < tmp_cnt)

} }

} }

int main()

面試題 找出字串中連續出現次數最多的子串

微軟的一道面試題 如 abcbcbcabc,這個連續出現次數最多的字串是bc 一,考慮邊界問題。二,實現優化笛卡爾積組合,總體我是這樣想的 就是縱向切出字串的連續組合集合,在橫向一對一跳躍比較集合元素。例如 abcbcabc 一,縱向切 得到所有字串組合,注意 這裡要求的是最多連續子字串,其實就是優...

找出字串中連續出現次數最多的子串

基本演算法描述 給出乙個字串abababa 1.窮舉出所有的字尾子串 substrs 0 abababa substrs 1 bababa substrs 2 ababa substrs 3 baba substrs 4 aba substrs 5 ba substrs 6 a 2.然後進行比較 s...

找出字串中連續出現最多的字元和個數(蘑菇街)

例子 abcaakjbb abbkejsbcccwqaa 思路 首先運用正規表示式 按照相同字元 進行分割成陣列,然後比較陣列中的長度,找出長度最長的字串,他的首位就是輸出物件的鍵值,他的length就是屬性值。我的答案 function findlong str let a 0 數字 let b ...