最长回文子串
- 运用动态规划的思路求解。如果一个子串是回文串,那么去掉它的首尾字符,它还是一个回文串,由此我们得到状态回归方程:F(i,j) = F(i+1,j-1)^(s(i)==s(j)),边界条件为:子串的长度小于3,或者s(i)!=s(j)。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len == 1){
return s;
}
char []ch = s.toCharArray();
boolean [][]S = new boolean[len][len];
int sum = 1;
int start = 0;
for(int i = 0; i < len; i++){
S[i][i] = true;
}
for(int L = 2; L <= len; L++){
for(int i = 0; i < len; i++){
int j = L + i - 1;
if(j >= len){
break;
}
if(ch[i] == ch[j]){
if(j - i < 3){
S[i][j] = true;
}else{
S[i][j] = S[i+1][j-1];
}
if(S[i][j] && j - i + 1 > sum){
sum = j - i + 1;
start = i;
}
}else{
S[i][j] = false;
}
}
}
return s.substring(start, start + sum);
}
}
Z 字形变换
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2) return s;
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
int i = 0, flag = -1;
for(char c : s.toCharArray()) {
rows.get(i).append(c);
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;
}
StringBuilder res = new StringBuilder();
for(StringBuilder row : rows) res.append(row);
return res.toString();
}
}
整数反转
- 即大数取模问题,采用取模运算取个位数,然后除10,重复直到变成0为止,本题由于题目对整数的大小要求是32位,则每次取完后判断一次是否大于214748364或小于-214748364即可
class Solution {
public int reverse(int x) {
int res = 0;
while(x!=0) {
int tmp = x%10;
if (res>214748364 || (res==214748364 && tmp>7)) {
return 0;
}
if (res<-214748364 || (res==-214748364 && tmp<-8)) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
}