2014百度校園招聘筆試——求一個字串的最長迴文子串
想到上月28號去百度筆試,遇到了一道題:已知一個N(N很大)長的字串,求最長的迴文子串。
看了一些部落格,有很多種方法實現,我選其中的兩種方法:
1.暴力搜尋法。即不使用技巧,窮舉所有可能。時間複雜度為O(n^3)(時間上最長,不推薦使用),空間複雜度為O(1)。
2.由中心向兩邊擴充套件法。時間複雜度為O(n^2),空間複雜度為O(1),稍好,並且易於理解,推薦使用。
由於沒有限制語言,我分別用C++和Java實現,如下:
C++:1.暴力搜尋法:
- #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
- 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;
- }
- #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.暴力搜尋法:
- 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.由中心向兩邊擴充套件法:
- 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.
相關推薦
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 =