【演算法25】對稱子字串的最大長度

來源:互聯網
上載者:User

  【題   目】輸入一個字串,輸出該字串中最大對稱子串的長度。例如輸入字串:“google”,該字串中最長的子字串是“goog”,長度為4,因而輸出為4。

  【思 路1】一看這題就是遍曆!沒錯,我們最直觀的往往也是最容易實現的,這裡我們暫且不考慮效率的問題。我們的基本思路是:我們如果有一個判斷一個字串是不是對稱的函數的話,我們就可以用這個子函數逐一檢查原字串中所有的字串,然後輸出長度最大的即可。

  (1)怎樣判斷一個字串是不是對稱的字串?我們可以用兩個指標分別指向字串的第一個字元和最後一個字元,判斷是否相等,如果不等直接返回false,如果為真則接著比較下一對字元。(2)如果遍曆遍曆原字串的所有子串,首先我們讓一個指標從頭至尾遍曆,對於這個指標的每一個字元,我們在用另一個指標逐一指向它後面的每一個字元即可。好了,兩個問題都解決了,我們可以寫出如下的代碼:

 1 #include<iostream>
2 #include<string>
3 #include<cstring>
4 using namespace std;
5
6 /************************************************
7 * 判斷一個字串是否是對稱的
8 *************************************************/
9 bool IsSymmetricalString(char* pstart,char* pend)
10 {
11 if(pstart == NULL || pend == NULL || pstart > pend)
12 return false;
13
14 while(pstart < pend)
15 {
16 if(*pstart != *pend)
17 {
18 return false;
19 }
20 else
21 {
22 pstart++;
23 pend--;
24 }
25 }
26
27 return true;
28 }
29
30
31 /*************************************************
32 * 求最大對稱子串的長度
33 **************************************************/
34 int MaxSymmetricalSubstringLenth(char *pstring)
35 {
36 if(pstring == NULL)
37 return 0;
38
39 int maxlength = 1;
40
41 int length = strlen(pstring);
42 char* pfirst = pstring;
43 while(pfirst < &pstring[length - 1])
44 {
45 char* psecond = pfirst + 1;
46 while(psecond <= &pstring[length - 1])
47 {
48 if(IsSymmetricalString(pfirst,psecond))
49 {
50 int templength = psecond - pfirst + 1;
51 if(templength > maxlength)
52 {
53 maxlength = templength;
54 }
55 }
56
57 psecond++;
58 }
59
60 pfirst++;
61 }
62
63 return maxlength;
64 }
65
66 int main()
67 {
68 cout<<"Please Enter Your String(the length must <1000 ):"<<endl;
69 char* yourstring = new char[1000];
70 cin>>yourstring;
71
72 cout<<"The Max Symmetrical SubString Length in Your String is:"<<endl;
73 cout<<MaxSymmetricalSubstringLenth(yourstring)<<endl;
74
75 return 0;
76 }

  運行結果如下:

  反思:我們現在來分析一下該演算法的時間複雜度,首先遍曆原字串的所有子串有兩個迴圈,這個時間複雜度是O(n2),我們在這兩層迴圈之間有一個判斷給定字串是不是對稱的子函數,這個子函數的時間複雜度是O(n),所以總的時間複雜度是O(n3).由於我們是由外向內判斷一個字串是不是對稱的,那麼對於形如aba的字子串(b可以含有很多字元),我們判斷aa相等後,還得判斷b是否是對稱;而在判斷子串b的時候還得再判斷一次,換句話說有很多的子串我們是重複判斷的。那麼我們能不能消除這種重複呢?、

  【思 路2】根據上面的分析,我們很容易想到,如果我們從內向外比較字元,那麼對於aba型的字串,如果我們判斷了b是對稱的,只需要再左右各移一位就可以判斷下一個字串是否是對稱的,這樣我們就能避免重複;然而我們需要注意的是,對於原字串中每一個字元有兩種情況,一種是子串是以單個字元為中心對稱分布的,換句話說,子串的長度是奇數;另一種情況是子串以兩個字串為中心,即子串的長度是偶數。至此我們就可以寫出如下的代碼:

 1 #include<iostream>
2 #include<string>
3 using namespace std;
4
5 /*********************************************************************
6 * 計算字串最大對稱子串的長度
7 *********************************************************************/
8 int MaxSymmetricalSubstringLenth(char* pstring)
9 {
10 int maxlength = 1;
11
12 char* pchar = pstring + 1;
13 while(*pchar != '\0')
14 {
15 //以該字串為中心,子串長度為奇數
16 char *pfirst = pchar - 1;
17 char *psecond = pchar + 1;
18 while(pfirst > pstring && psecond < &pstring[strlen(pstring) - 1] && *pfirst == *psecond)
19 {
20 pfirst--;
21 psecond++;
22 }
23
24 int templength = psecond - pfirst + 1;
25 if(templength > maxlength)
26 {
27 maxlength = templength;
28 }
29
30
31 //字該字元及之後的字元兩個為中心,子串為偶數
32 pfirst = pchar - 1;
33 psecond = pchar;
34 while(pfirst > pstring && psecond < &pstring[strlen(pstring) - 1] && *pfirst == *psecond)
35 {
36 pfirst--;
37 psecond++;
38 }
39
40 templength = psecond - pfirst + 1;
41 if(templength > maxlength)
42 {
43 maxlength = templength;
44 }
45
46 pchar++;
47 }
48
49 return maxlength;
50 }
51
52 int main()
53 {
54 cout<<"Please Enter Your String:"<<endl;
55 char *yourstring = new char[1000];
56 cin>>yourstring;
57
58 cout<<"The Max Symmetrical SubString Length is:"<<endl;
59 cout<<MaxSymmetricalSubstringLenth(yourstring)<<endl;
60
61 delete[] yourstring;
62 return 0;
63 }

  測試結果如下:

  效率分析:這種演算法首先需要遍曆一邊字串,外層為n,對於每一個字元,需要從該字元開始有中間到兩邊遍曆一遍,因而總的時間複雜度是O(n2).

 

References:

程式員面試題精選100題:http://zhedahht.blog.163.com/blog/static/25411174201063105120425/

註:

1)本部落格所有的代碼環境編譯均為win7+VC6。所有代碼均經過博主上機調試。

2)博主python27對本部落格文章享有著作權,網路轉載請註明出處http://www.cnblogs.com/python27/。對解題思路有任何建議,歡迎在評論中告知。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.