给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121 - 。因此它不是一个回文数。
示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
C++ class Solution {public : bool isPalindrome (int x) { string s = to_string (x); string s1 = s; reverse (s.begin (), s.end ()); return s == s1; } };
给定一个包含大写字母和小写字母的字符串 s
,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa"
不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd" , 它的长度是 7。
示例 2:
提示:
1 <= s.length <= 2000
s
只由小写 和/或 大写英文字母组成
C++ class Solution {public : int longestPalindrome (string s) { int res = 0 ; map<char , int > mp; for (char ch : s){ mp[ch]++; } for (auto i : mp){ int o = i.second; res += o/2 * 2 ; if (res % 2 == 0 && o % 2 == 1 ){ res += 1 ; } } return res; } };
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
C++ class Solution {public : bool isPalindrome (string s) { string sgood; for (char ch: s) { if (isalnum (ch)) { sgood += tolower (ch); } } string sgood_rev (sgood.rbegin(), sgood.rend()) ; return sgood == sgood_rev; } };
给你一个字符串 s
,最多 可以从中删除一个字符。
请你判断 s
是否能成为回文字符串:如果能,返回 true
;否则,返回 false
。
示例 1:
示例 2:
输入:s = "abca" 输出:true 解释:你可以删除字符 'c' 。
示例 3:
提示:
1 <= s.length <= 105
s
由小写英文字母组成
C++ class Solution {public : bool validPalindrome (string s) { int l = 0 ; int r = s.size () - 1 ; while (l <= r ){ if (s[l] != s[r]){ return isValid (s, l + 1 , r) || isValid (s, l, r - 1 ); } l ++; r --; } return true ; } bool isValid (string s, int l, int r) { while (l <= r){ if (s[l] != s[r]) return false ; l ++; r --; } return true ; } };
class Solution {public : int res = 0 ; bool validPalindrome (string s) { int l = 0 ; int r = s.size () - 1 ; while (l <= r && res <= 1 ){ if (s[l] != s[r]){ if (s[l + 1 ] == s[r]) { l ++; res ++; } else if (s[l] == s[r - 1 ]){ r --; res ++; } else return false ; } l ++; r --; } return res <= 1 ? true : false ; } };
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
C++ class Solution {public : int max = 0 ; int begin = 0 ; int end = 0 ; string longestPalindrome (string s) { int n = s.size (); if (n <= 1 ) return s; vector<vector<bool >> dp (n, vector <bool >(n, false )); for (int i = n - 1 ; i >= 0 ; i --){ for (int j = i; j < n; j ++){ if (j - i < 1 ) dp[i][j] = true ; else if (j - i == 1 ) dp[i][j] = s[i] == s[j]; else dp[i][j] = s[i] == s[j] && dp[i + 1 ][j - 1 ]; if (dp[i][j] && j - i + 1 > max) { max = j - i + 1 ; begin = i; end = j; } } } return s.substr (begin, max); } };
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = "abc" 输出:3 解释:三个回文子串: "a" , "b" , "c"
示例 2:
输入:s = "aaa" 输出:6 解释:6 个回文子串: "a" , "a" , "a" , "aa" , "aa" , "aaa"
提示:
1 <= s.length <= 1000
s
由小写英文字母组成
C++ class Solution {public : int res = 0 ; int countSubstrings (string s) { int n = s.size (); vector<vector<bool >> dp (n, vector <bool >(n, false )); for (int i = n - 1 ; i >= 0 ; i --){ for (int j = i; j < n; j ++){ if (j - i < 1 ) dp[i][j] = true ; else if (j - i == 1 ) dp[i][j] = s[i] == s[j]; else dp[i][j] = s[i] == s[j] && dp[i + 1 ][j - 1 ]; if (dp[i][j] == true ) res ++; } } return res; } };
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab" 输出:[["a" ,"a" ,"b" ],["aa" ,"b" ]]
示例 2:
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
C++ class Solution {public : vector<vector<string>> res; vector<vector<string>> partition (string s) { dfs (s, {}); return res; } void dfs (string s, vector<string> path) { if (s.size () == 0 ) { res.push_back (path); return ; } for (int i = 1 ; i <= s.size (); i++) { string pre = s.substr (0 , i); if (isPalindrome (pre)) { path.push_back (pre); dfs (s.substr (i), path); path.pop_back (); } } } bool isPalindrome (string s) { if (s.size () == 0 ) return true ; int l = 0 , r = s.size () - 1 ; while (l <= r) { if (s[l] != s[r]) return false ; l ++; r --; } return true ; } };
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = "aab" 输出:1 解释:只需一次分割就可将 s 分割成 ["aa" ,"b" ] 这样两个回文子串。
示例 2:
示例 3:
提示:
1 <= s.length <= 2000
s
仅由小写英文字母组成
C++
class Solution {public : int minCut (string s) { int n = s.size (); if (n == 1 ) return 0 ; if (n == 2 ) return s[0 ] == s[1 ] ? 0 : 1 ; vector<int > dp (n, INT_MAX) ; vector<vector<bool >> res = isPalindrome (s); dp[0 ] = 0 ; dp[1 ] = s[0 ] == s[1 ] ? 0 : 1 ; for (int r = 2 ; r < n; r ++){ for (int l = 0 ; l <= r; l ++){ if (res[l][r]){ if (l > 0 ) dp[r] = min (dp[r], dp[l - 1 ] + 1 ); else dp[r] = 0 ; } } } return dp[n - 1 ]; } vector<vector<bool >> isPalindrome (string s) { int n = s.size (); vector<vector<bool >> dp (n, vector <bool >(n, false )); for (int i = n - 1 ; i >= 0 ; i --){ for (int j = i; j < n; j ++){ if (j - i < 1 ) dp[i][j] = true ; else if (j - i == 1 ) dp[i][j] = s[i] == s[j]; else dp[i][j] = s[i] == s[j] && dp[i + 1 ][j - 1 ]; } } return dp; } };
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = "bbbab" 输出:4 解释:一个可能的最长回文子序列为 "bbbb" 。
示例 2:
输入:s = "cbbd" 输出:2 解释:一个可能的最长回文子序列为 "bb" 。
提示:
1 <= s.length <= 1000
s
仅由小写英文字母组成
C++
class Solution {public : int longestPalindromeSubseq (string s) { int n = s.size (); vector<vector<int >> dp (n, vector <int >(n, 0 )); for (int i = n - 1 ; i >= 0 ; i --){ for (int j = i; j < n; j ++){ if (j - i < 1 ) dp[i][j] = 1 ; else if (j - i == 1 ) dp[i][j] = s[i] == s[j] ? 2 : 1 ; else if (s[i] == s[j]) dp[i][j] = dp[i + 1 ][j - 1 ] + 2 ; else dp[i][j] = max (dp[i + 1 ][j], dp[i][j - 1 ]); } } return dp[0 ][n - 1 ]; } };