63. 不同路径Ⅱ
题目:



题解:
java
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
if(m==0&&n==0) {
return 0;
}
if(obstacleGrid[0][0]==1) {
return 0;
}
int[][] dp = new int[m][n];
dp[0][0]=1;
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(obstacleGrid[i][j]==1) {
continue;
}
else if(i==0&&j==0) {
continue;
}
else if(i==0) {
dp[i][j]=dp[i][j-1];
}
else if(j==0) {
dp[i][j]=dp[i-1][j];
}
else {
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
5. 最长回文子串
题目:

题解:


java
class Solution {
public String longestPalindrome(String s) {
if(s==null || s.length()==0) {
return "";
}
char[] chars = s.toCharArray();
//记录最大的范围
int maxStart = 0;
int maxLen = 0;
//当前的信息
int left = 0;
int right = 0;
int len=0;
for(int i=0;i<chars.length;i++) {
left = i-1;
right = i+1;
len = 1;
while(left>=0&&chars[left]==chars[i]) {
left--;
len++;
}
while(right<chars.length&&chars[right]==chars[i]) {
right++;
len++;
}
while(left>=0&&right<chars.length&&chars[right]==chars[left]) {
left--;
right++;
len+=2;
}
if(len>maxLen) {
maxLen=len;
maxStart=left;
}
}
return s.substring(maxStart+1, maxStart+maxLen+1);
}
}
优化版:

java
class Solution {
public String longestPalindrome(String s) {
if(s==null || s.length()==0) {
return "";
}
//用来记录dp[l][r]之间是否为回文子串
boolean[][] dp = new boolean[s.length()][s.length()];
//最大的回文长度
int maxLen = 1;
//最大的回文子串的start
int maxStart = 0;
char[] chars = s.toCharArray();
for(int i=1;i<chars.length;i++) {
for(int j=0;j<i;j++) {
if(chars[i]==chars[j]&&(i-j<=2||dp[j+1][i-1])) {
dp[i][j]=true;
if(i-j+1>maxLen) {
maxLen=i-j+1;
maxStart=j;
}
}
}
}
return s.substring(maxStart, maxStart+maxLen);
}
}