百度笔试面试

来源:互联网 发布:淘宝客服 日均接待量 编辑:程序博客网 时间:2024/05/16 10:05

2014百度校园招聘笔试——求一个字符串的最长回文子串

想到上月28号去百度笔试,遇到了一道题:已知一个N(N很大)长的字符串,求最长的回文子串。

看了一些博客,有很多种方法实现,我选其中的两种方法:

1.暴力搜索法。即不使用技巧,穷举所有可能。时间复杂度为O(n^3)(时间上最长,不推荐使用),空间复杂度为O(1)。

2.由中心向两边扩展法。时间复杂度为O(n^2),空间复杂度为O(1),稍好,并且易于理解,推荐使用。

由于没有限制语言,我分别用C++和Java实现,如下:

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

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

[cpp] view plaincopyprint?
  1. #include<string>   
  2. #include<iostream>   
  3. using namespace std;  
  4.   
  5. string getString(string str,int l,int r){     
  6.     int n=str.length();  
  7.     while(l>=0&&r<=n-1&&str[l]==str[r]){  
  8.         l--;  
  9.         r++;  
  10.     }  
  11.     return str.substr(l+1,r-l-1);  
  12. }  
  13.   
  14. string IsPalindrome(string str){  
  15.     int n=str.length();  
  16.     if(str==""){  
  17.         return "";  
  18.     }  
  19.     string longest=str.substr(0,1);  
  20.     for(int i=0;i<n-1;i++){  
  21.         string p1=getString(str,i,i);  
  22.         if(p1.length()>longest.length()){  
  23.             longest=p1;  
  24.         }  
  25.         string p2=getString(str,i,i+1);  
  26.         if(p2.length()>longest.length()){  
  27.             longest=p2;  
  28.         }  
  29.     }  
  30.     return longest;  
  31. }  
  32.   
  33. int main(){  
  34.     string str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  35.     string s=IsPalindrome(str);  
  36.     cout<<s<<endl;  
  37.     return 0;  
  38. }  
#include<string>#include<iostream>using namespace std;string getString(string str,int l,int r){int n=str.length();while(l>=0&&r<=n-1&&str[l]==str[r]){l--;r++;}return str.substr(l+1,r-l-1);}string IsPalindrome(string str){int n=str.length();if(str==""){return "";}string longest=str.substr(0,1);for(int i=0;i<n-1;i++){string p1=getString(str,i,i);if(p1.length()>longest.length()){longest=p1;}string p2=getString(str,i,i+1);if(p2.length()>longest.length()){longest=p2;}}return longest;}int main(){string str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";string s=IsPalindrome(str);cout<<s<<endl;return 0;}

Java:1.暴力搜索法:

[java] view plaincopyprint?
  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.       
  34.     public static void main(String[] args){  
  35.         String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  36.         String s=longestPalindrome(str);  
  37.         System.out.println(s);  
  38.     }  
  39. }  
public class Palindrome2 {private static String longestPalindrome(String str){if(str==""){return "";}int n=str.length();int maxLength=-1;int beginIndex=0;int endIndex=0;for(int i=0;i<n;i++){for(int j=i;j<n;j++){int start=i;int end=j;boolean flag=true;while(start<=end){if(str.charAt(start)!=str.charAt(end)){flag=false;break;}start++;end--;}int tmpLength=j-i+1;if(flag&&tmpLength>maxLength){maxLength=tmpLength;beginIndex=i;endIndex=j+1;}}}return str.substring(beginIndex,endIndex);}public static void main(String[] args){String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";String s=longestPalindrome(str);System.out.println(s);}}

2.由中心向两边扩展法:

[java] view plaincopyprint?
  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.       
  21.     private static String expandAroundCenter(String str,int l,int r){  
  22.         int n=str.length();       
  23.         while(l>=0&&r<=n-1&&str.charAt(l)==str.charAt(r)){  
  24.             l--;  
  25.             r++;  
  26.         }         
  27.         /** 
  28.          * 这里要注意,c++中的str.substr(beginIndex,length)的后一个参数是从beginIndex开始的长度,      
  29.          * 而java中的str.substring(beginIndex,endIndex)的后一个参数是一个下标,应不小于beginIndex, 
  30.          * 并且在获取的字符串中,不包括该下标, 
  31.          */  
  32.         return str.substring(l+1, r);         
  33.     }  
  34.     public static void main(String[] args){  
  35.         String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";  
  36.         String s=longestPalindrome(str);  
  37.         System.out.println(s);  
  38.     }  
  39. }  
public class Palindrome {private static String longestPalindrome(String str){int n=str.length();if(str==""){return "";}String longest=str.substring(0, 1);for(int i=0;i<n-1;i++){String p1=expandAroundCenter(str,i,i);if(p1.length()>longest.length()){longest=p1;}String p2=expandAroundCenter(str,i,i+1);if(p2.length()>longest.length()){longest=p2;}}return longest;}private static String expandAroundCenter(String str,int l,int r){int n=str.length();while(l>=0&&r<=n-1&&str.charAt(l)==str.charAt(r)){l--;r++;}/** * 这里要注意,c++中的str.substr(beginIndex,length)的后一个参数是从beginIndex开始的长度, * 而java中的str.substring(beginIndex,endIndex)的后一个参数是一个下标,应不小于beginIndex, * 并且在获取的字符串中,不包括该下标, */return str.substring(l+1, r);}public static void main(String[] args){String str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";String s=longestPalindrome(str);System.out.println(s);}}

以上输出结果均为:dsjfkldsababasdlkfjsd.

参考:http://www.cnblogs.com/ZJUKasuosuo/archive/2012/07/19/2599636.html