最近换工作有点忙,刷题也不积极了~
5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路
根据要求有两个点:
- 长度最长
- 回文串
所以不妨假设存在这一的一个子串,逆序枚举长度,一旦其是回文,立马返回即可。
分析一下时间复杂度,极限情况为: 500500250 = 62500000 < 10^8,所以可尝试一下。
解法
class Solution {
public String longestPalindrome(String s) {
String sub;
// 枚举长度
for (int i = s.length(); i > 0; i--) {
// 顺序取子串
for (int j = 0; j + i <= s.length(); j++) {
// 判断合法与否
if(isPanlindrome( sub = s.substring(j, j+i))){
return sub;
}
}
}
return "";
}
private boolean isPanlindrome(String s){
int i=0, j= s.length()-1;
while(i<j){
if(s.charAt(i++)!=s.charAt(j--)){
return false;
}
}
return true;
}
}
6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
思路
通过画图标记处下标,很快就可以找到规律,无需详说。
解法
class Solution {
public String convert(String s, int numRows) {
if (null == s || s.length() == 0) {
return "";
}
int n = 2 * numRows - 2;
if (n <= 0) {
return s;
}
return build(s, n, numRows);
}
private String build(String s, int n, int r) {
int i = 0, split;
boolean odd;
StringBuilder builder = new StringBuilder();
while (i < r) {
split = isFirstOrLast(i,r) ? n : n - (r - i - 1) * 2;
odd = true;
for (int j = i; j < s.length(); j += odd||isFirstOrLast(i,r) ? split : n - split) {
builder.append(s.charAt(j));
odd = !odd;
}
++i;
}
return builder.toString();
}
private boolean isFirstOrLast(int i, int r){
return (i == 0 || i == r - 1);
}
}
7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
思路
简单的字符流。注意极限情况整形溢出就好。
解法
class Solution {
public int reverse(int x) {
long n = Math.abs((long) Math.abs(x));
boolean isPos = x >= 0;
String buf = Long.toString(n);
StringBuilder builder = new StringBuilder();
for (int i = buf.length() - 1; i >= 0; --i) {
builder.append(buf.charAt(i));
}
Long rn = new Long(builder.toString());
if (rn > Integer.MAX_VALUE || rn < Integer.MIN_VALUE) {
return 0;
}
if (isPos) {
return rn.intValue();
}
return -rn.intValue();
}
}
以上。