1. 程式人生 > >2014百度校園招聘筆試——求一個字串的最長迴文子串

2014百度校園招聘筆試——求一個字串的最長迴文子串

想到上月28號去百度筆試,遇到了一道題:已知一個N(N很大)長的字串,求最長的迴文子串。

看了一些部落格,有很多種方法實現,我選其中的兩種方法:

1.暴力搜尋法。即不使用技巧,窮舉所有可能。時間複雜度為O(n^3)(時間上最長,不推薦使用),空間複雜度為O(1)。

2.由中心向兩邊擴充套件法。時間複雜度為O(n^2),空間複雜度為O(1),稍好,並且易於理解,推薦使用。

由於沒有限制語言,我分別用C++和Java實現,如下:

C++:1.暴力搜尋法:

  1. #include<string>  
  2. #include<iostream>  
  3. using namespace std;  
  4. string IsPalindrome(string str){  
  5.     if(str==""){  
  6.         return "";  
  7.     }  
  8.     int n=str.length();  
  9.     int maxLength=-1;  
  10.     int maxIndex=0;   
  11.     for(int i=0;i<n;i++){  
  12.         for(int j=i;j<n;j++){  
  13.             int start=i;  
  14.             int end=j;  
  15.             bool flag=true;  
  16.             while
    (start<=end){  
  17.                 if(str[start]!=str[end]){  
  18.                     flag=false;  
  19.                     break;  
  20.                 }  
  21.                 start++;  
  22.                 end--;  
  23.             }  
  24.             int tmpLength=j-i+1;  
  25.             if(flag&&tmpLength>maxLength){  
  26.                 maxLength=tmpLength;  
  27.                 maxIndex=i;  
  28.             }  
  29.         }  
  30.     }  
  31.     return str.substr(maxIndex,maxLength);  
  32. }  
  33. int main(){  
  34.     string str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  35.     string s=IsPalindrome(str);  
  36.     cout<<s<<endl;  
  37.     return 0;  
  38. }  
2.由中心向兩邊擴充套件法:
  1. #include<string>  
  2. #include<iostream>  
  3. using namespace std;  
  4. string getString(string str,int l,int r){     
  5.     int n=str.length();  
  6.     while(l>=0&&r<=n-1&&str[l]==str[r]){  
  7.         l--;  
  8.         r++;  
  9.     }  
  10.     return str.substr(l+1,r-l-1);  
  11. }  
  12. string IsPalindrome(string str){  
  13.     int n=str.length();  
  14.     if(str==""){  
  15.         return "";  
  16.     }  
  17.     string longest=str.substr(0,1);  
  18.     for(int i=0;i<n-1;i++){  
  19.         string p1=getString(str,i,i);  
  20.         if(p1.length()>longest.length()){  
  21.             longest=p1;  
  22.         }  
  23.         string p2=getString(str,i,i+1);  
  24.         if(p2.length()>longest.length()){  
  25.             longest=p2;  
  26.         }  
  27.     }  
  28.     return longest;  
  29. }  
  30. int main(){  
  31.     string str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  32.     string s=IsPalindrome(str);  
  33.     cout<<s<<endl;  
  34.     return 0;  
  35. }  

Java:1.暴力搜尋法:

  1. public class Palindrome2 {  
  2.     private static String longestPalindrome(String str){  
  3.         if(str==""){  
  4.             return "";  
  5.         }  
  6.         int n=str.length();  
  7.         int maxLength=-1;  
  8.         int beginIndex=0;  
  9.         int endIndex=0;       
  10.         for(int i=0;i<n;i++){  
  11.             for(int j=i;j<n;j++){  
  12.                 int start=i;  
  13.                 int end=j;    
  14.                 boolean flag=true;  
  15.                 while(start<=end){                     
  16.                     if(str.charAt(start)!=str.charAt(end)){  
  17.                         flag=false;   
  18.                         break;  
  19.                     }  
  20.                     start++;  
  21.                     end--;  
  22.                 }  
  23.                 int tmpLength=j-i+1;  
  24.                 if(flag&&tmpLength>maxLength){  
  25.                     maxLength=tmpLength;  
  26.                     beginIndex=i;  
  27.                     endIndex=j+1;  
  28.                 }  
  29.             }  
  30.         }  
  31.         return str.substring(beginIndex,endIndex);  
  32.     }  
  33.     public static void main(String[] args){  
  34.         String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  35.         String s=longestPalindrome(str);  
  36.         System.out.println(s);  
  37.     }  
  38. }  

2.由中心向兩邊擴充套件法:

  1. public class Palindrome {  
  2.     private static String longestPalindrome(String str){  
  3.         int n=str.length();  
  4.         if(str==""){  
  5.             return "";  
  6.         }  
  7.         String longest=str.substring(01);  
  8.         for(int i=0;i<n-1;i++){  
  9.             String p1=expandAroundCenter(str,i,i);  
  10.             if(p1.length()>longest.length()){  
  11.                 longest=p1;  
  12.             }  
  13.             String p2=expandAroundCenter(str,i,i+1);  
  14.             if(p2.length()>longest.length()){  
  15.                 longest=p2;  
  16.             }  
  17.         }  
  18.         return longest;       
  19.     }  
  20.     private static String expandAroundCenter(String str,int l,int r){  
  21.         int n=str.length();       
  22.         while(l>=0&&r<=n-1&&str.charAt(l)==str.charAt(r)){  
  23.             l--;  
  24.             r++;  
  25.         }         
  26.         /** 
  27.          * 這裡要注意,c++中的str.substr(beginIndex,length)的後一個引數是從beginIndex開始的長度,      
  28.          * 而java中的str.substring(beginIndex,endIndex)的後一個引數是一個下標,應不小於beginIndex, 
  29.          * 並且在獲取的字串中,不包括該下標, 
  30.          */  
  31.         return str.substring(l+1, r);         
  32.     }  
  33.     public static void main(String[] args){  
  34.         String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  35.         String s=longestPalindrome(str);  
  36.         System.out.println(s);  
  37.     }  
  38. }  

以上輸出結果均為:dsjfkldsababasdlkfjsd.

相關推薦

2014校園招聘筆試——一個字串

想到上月28號去百度筆試,遇到了一道題:已知一個N(N很大)長的字串,求最長的迴文子串。 看了一些部落格,有很多種方法實現,我選其中的兩種方法: 1.暴力搜尋法。即不使用技巧,窮舉所有可能。時間複雜度為O(n^3)(時間上最長,不推薦使用),空間複雜度為O(1)。 2.由中

【LeetCode】Longest Palindromic Substring && 【九】題目1528:(騰訊2013年實習生招聘二面面試題)

         Longest Palindromic Substring          Total Accepted: 4808 Total Submissions: 23151 My Submissions         Given a string S, fi

【HDU - 3068】(Manacher演算法,馬拉車演算法

題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩

馬拉車演算法()

1 #include <vector> 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 7 string Manacher(string s) {

Manacher演算法(一個字串中找到)

零、預備知識   Manacher用於在一個字串中找到最長的迴文子串。   迴文串:正著念和反著念一樣,例如aabbaa,anna等。   注意子串與子序列的區別:     子串必須是在原字元中可以找到的。比如 " I am a student"。am是子串(當然也是子序列),但是aa就不是子串了(是

動態規劃1.

求字串的子串大致有四中方法,暴力,DP,中心拓展,馬拉車演算法,這篇講DP怎麼做。 DP最重要的就是要能利用到前面的結果來推斷當前狀態,比暴力優化的地方就在此,暴力需要對每一個字串做一次O(n)的操作才能判斷出結果,也就是整個過程要O(n^3),但DP對每一個字串的判斷時間是O(1),總共是O(n^2)

java

/** * 求最長迴文子串 * 子串:連續的 * 暴力窮舉 */ public static String get01() { Stri

【Manacher模板】HDU 3068——

直接做會超時,需要優化,網上通行的演算法是manacher演算法(具體原理還不是很明白),這裡可以當模板使。 // 原串最大長度N // 返回最大回文字串 res #include<cstdio> #include<cstring> #includ

Manacher演算法------(Java)

最長迴文子串 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: "abc1234321ab",12 返回:7 public class Main {      public st

(多種解法)

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest

(java)

一開始看到這個題目的時候,我就想到了第一種思路: (1)從頭遍歷每個字元,從該字元向兩邊擴充套件,直到字串最長界限或者兩邊擴充套件的字元不相等為止,記錄每個字元搜尋的長度,並且找最大的即為最長迴文子串個數。演算法優化的地方(當一個字元的擴充套件長度為整個字串長度時候,停止搜

Java 實現

下面以字串12212321為例,經過上一步,變成了 S[] = "$#1#2#2#1#2#3#2#1#";然後用一個數組 P[i] 來記錄以字元S[i]為中心的最長迴文子串向左/右擴張的長度(包括S[i],也就是把該回文串“對摺”以後的長度),比如S和P的對應關係: S 

【動態規劃】公共

題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。 eg : fbaabe,ebaabf,連續最長子串長度為4。 注意:求最長迴文子串也可以用求最長公共子串來求,只需將字串反轉作為另外一個字串,迴文部分反轉之後不變,然後求LCS(Longes

(Longest Palindromic Substring)——三種時間複雜的解法

public String longestPalindrome(String s) {        List<Character> s_new = new ArrayList<>();        for(int i = 0;i < s.length();i++){     

對於一個字串,請設計一個高效演算法,計算其中的長度。

給定字串A以及它的長度n,請返回最長迴文子串的長度。  測試樣例: "abc1234321ab",12  返回:7 分析與解法 最容易想到的辦法是列舉所有的子串,分別判斷其是否為迴文。這個思路初看起來是正確的,但卻做了很多無用功,如果一個長的子串包含另一個短一些的子

_Manacher演算法_Java實現

通過對大神C程式碼的分析學習,結合自身理解,留下自己的Java實現過程。 原文: http://blog.csdn.net/xingyeyongheng/article/details/9310555 Manacher演算法求最長迴文子串,其時間複雜度幾乎是o(n),利用迴

O(n)的方法長度(Manacher演算法)

大體思路其實就是找出一箇中心點,判斷中心點兩端的迴文串半徑是多少; 但由於找中心點的方法只適用於奇數長的迴文串,故可以在每兩個字元間插入一個間隔符來幫助結算; 用rd[i]表示以經過填充後的字串裡的第i個字元為中心,它的迴文串長度; 可以得知,在【

Manacher演算法解決問題---O(n)時間複雜

#include <iostream> #include <string.h> using namespace std; void Manacher(char *src) { char *str = new char[2*strlen(src)+3]; str[0]

字串公共連續---C++程式設計

題目:有兩個字串(可能包含空格),找出其中最長的公共連續子串,並輸出其長度。  輸入描述:輸入為兩行字串(可能包含空格),長度均小於等於50。 輸出描述:  輸出為一個整數,表示最長公共連續子串的

2014校園招聘筆試題(上海軟體研發工程師)

10月12號中午收到了百度筆試的通知,10月13號下午2:00到4:00在浙大玉泉參加筆試。時間很緊,就匆匆從溫州乘動車來到杭州 筆試的題目: 一.簡答題 1.簡述iso的7層設計 2.如何在多個進行間進行資料共享(至少寫出3種) 3.簡述TCP與UDP的區別 二.演算法題 1.有一個數據A =