leetcode 回文問題小結

2021-07-25 20:13:54 字數 3955 閱讀 1215

問題描述

判斷數字是否是回文,空間複雜度o(1)。

解題思路

法一: 將數字轉換成字串,判斷乙個字串是否是回文。

public

boolean ispalindrome(int x)

return

true;

}

法二:獲得reverse之後的數字,如果兩個數字相同,則是回文。

public

boolean

ispalindrome(int x)

return ret==pre ? true : false;

}

問題描述

判斷單鏈表是不是回文,時間複雜度o(n),空間複雜度o(1)。

解題思路

將鍊錶前一半反轉,中間值為頭指標,頭變成尾,如果與後半部分相同,就是回文鍊錶,會破壞鍊錶結構。改進:用快慢指標求煉表中點。

public boolean ispalindrome(listnode head) 

if(length%2!=0)

head = head.next;

while(pre != null && head != null)

pre = pre.next;

head = head.next;

}return (pre == null && head == null) ? true : false;

}public

intgetlength(listnode head)

return count;

}

問題描述

給定乙個字串s,你可以通過在它前面新增字元將它轉換為回文。 查詢並返回通過執行此轉換可以找到的最短回文。

解題思路

找到s中以字串首位為開頭的最長回文,將剩餘部分反序後新增到s的頭部。查詢最長回文時,從中間向兩邊查詢。

public

string shortestpalindrome(string s)

return ret+s;

}public

string ispalindrome(string s,int

left,int

right)

if((left-i)>=0)

return null;

stringbuffer sb = new stringbuffer(s.substring(right+i));

return sb.reverse().tostring();

}

問題描述

給定乙個字串s,分割s使得分割的每個子字串是乙個回文。返回s的所有可能的回文分割。

解題思路

遞迴方法

list

<

list

<

string

>> listall =

new arraylist<>();

public

list

<

list

<

string

>> partition(string s) else

return listall;

}public

void getpartition(string s, list

<

string

>

list)

int n = s.length();

for(int i =

1; i <= n; i++)

}varlist.add(str);

getpartition( s.substring(i,n),varlist);}}

}public boolean ispalindrome(string s)

int i =

0, j = s.length() -

1; while(i <= j)

return

true;

}

優化後:

list

<

list

<

string

>> resultlst;

arraylist<

string

> currlst;

public

list

<

list

<

string

>> partition(string s)

public

void backtrack(string s, int l)

for(int i=l;i}

}public boolean ispalindrome(string str, int l, int r)

return

true;

}

問題描述

給定乙個字串,確定它是否是回文的,僅僅考慮其中的數字和字元並忽略其他。

例如,

「a man, a plan, a canal: pannama」 是回文的。

「race a car」 不是回文。

解題思路

定義空字串是回文,將首位空格去掉,使用兩個指標,頭指標和尾指標,指向空格時跳過。

public

boolean ispalindrome(string s)

i++;

j--;

}return

true;

}public

boolean isalnum(char ch)

法二:先將字串的空格去掉,都變成小寫格式

public

boolean

ispalindrome(string s)

return

true;

}

問題描述

給定乙個由小寫或大寫字母組成的字串,找到可以用這些字母構建的最長回文的長度。區分大小寫,aa不是

解題思路

字母出現偶數次的都可以加到回文中。奇數次的要-1。

public int longestpalindrome(string s) else

}for(integer value : map

.values())

}return flag ?

sum+

1 : sum;

}

問題描述

給定乙個字串s,在s中找到最長的回文子串。 您可以假設s的最大長度為1000。 如 「babad」 的輸出是 「bab」或者「aba」

解題思路

暴力求解:窮舉思路:取出所有的子串,判斷它是否回文,並返回最長的子串。

動態規劃:用boolean[i][j]=true 表示字串從i到j的子串是回文串,當 pali[i+1][j-1] == true && s.charat(i)==s.charat(j)時,pali[i][j] = true;否則為false

空間、時間複雜度 o(n2)

public string longestpalindrome(string s) 

}for(int i = 0; i < s.length(); i++)}}

for(int i = s.length()-1; i >= 0; i--)

continue;

}if((j - i) ==1)

continue;

if( pali[i+1][j-1] == true && s.charat(i)==s.charat(j))

}else

pali[i][j] = false;}}

return ret;

}

manacher演算法:

leetcode專題 回文串問題

具體問題具體分析,往往思路就是從這裡來的。回文問題主要是判斷回文的時間複雜度太高,可以考慮dp 雜湊表 字典樹 字串雜湊 kmp 馬拉車等優化對回文的判斷。336.回文對 有些問題可以先嘗試,說不定能通過,但是形如o n 或者指數級複雜度就可以不考慮了。一般是子串行問題,迫不得已,沒辦法直接中心擴充...

回文樹學習小結

最近突然撿起了好久不搞的字串,研究了一下一直覺得很神奇的回文樹。相比於manacher,回文樹要顯得強大的多,同樣是接近o n 的複雜度,回文樹只需要多一點的空間,就可以實現許多用manacher實現起來非常複雜的功能。並且就 量而言,回文樹也足夠的簡短,作為處理回文串的工具,實在是非常的美妙。做了...

LEETCODE 數字回文

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121輸出 true示例 2 輸入 121輸出 false解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10輸出 false解釋 從右向左讀,為 01...