微軟的一道面試題:
如: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 ...