問題描述
判斷數字是否是回文,空間複雜度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...