mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 07:35:35 +08:00
@ -206,6 +206,55 @@ public:
|
||||
## Java
|
||||
|
||||
```java
|
||||
class Solution {
|
||||
|
||||
public int minCut(String s) {
|
||||
if(null == s || "".equals(s)){
|
||||
return 0;
|
||||
}
|
||||
int len = s.length();
|
||||
// 1.
|
||||
// 记录子串[i..j]是否是回文串
|
||||
boolean[][] isPalindromic = new boolean[len][len];
|
||||
// 从下到上,从左到右
|
||||
for(int i = len - 1; i >= 0; i--){
|
||||
for(int j = i; j < len; j++){
|
||||
if(s.charAt(i) == s.charAt(j)){
|
||||
if(j - i <= 1){
|
||||
isPalindromic[i][j] = true;
|
||||
} else{
|
||||
isPalindromic[i][j] = isPalindromic[i + 1][j - 1];
|
||||
}
|
||||
} else{
|
||||
isPalindromic[i][j] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2.
|
||||
// dp[i] 表示[0..i]的最小分割次数
|
||||
int[] dp = new int[len];
|
||||
for(int i = 0; i < len; i++){
|
||||
//初始考虑最坏的情况。 1个字符分割0次, len个字符分割 len - 1次
|
||||
dp[i] = i;
|
||||
}
|
||||
|
||||
for(int i = 1; i < len; i++){
|
||||
if(isPalindromic[0][i]){
|
||||
// s[0..i]是回文了,那 dp[i] = 0, 一次也不用分割
|
||||
dp[i] = 0;
|
||||
continue;
|
||||
}
|
||||
for(int j = 0; j < i; j++){
|
||||
// 按文中的思路,不清楚就拿 "ababa" 为例,先写出 isPalindromic 数组,再进行求解
|
||||
if(isPalindromic[j + 1][i]){
|
||||
dp[i] = Math.min(dp[i], dp[j] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[len - 1];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Python
|
||||
@ -240,6 +289,7 @@ class Solution:
|
||||
## Go
|
||||
|
||||
```go
|
||||
|
||||
```
|
||||
|
||||
## JavaScript
|
||||
|
@ -129,6 +129,9 @@ public:
|
||||
Java:
|
||||
|
||||
```java
|
||||
/*
|
||||
二维dp数组
|
||||
*/
|
||||
class Solution {
|
||||
public int longestCommonSubsequence(String text1, String text2) {
|
||||
int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作
|
||||
@ -146,6 +149,47 @@ class Solution {
|
||||
return dp[text1.length()][text2.length()];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
一维dp数组
|
||||
*/
|
||||
class Solution {
|
||||
public int longestCommonSubsequence(String text1, String text2) {
|
||||
int n1 = text1.length();
|
||||
int n2 = text2.length();
|
||||
|
||||
// 多从二维dp数组过程分析
|
||||
// 关键在于 如果记录 dp[i - 1][j - 1]
|
||||
// 因为 dp[i - 1][j - 1] <!=> dp[j - 1] <=> dp[i][j - 1]
|
||||
int [] dp = new int[n2 + 1];
|
||||
|
||||
for(int i = 1; i <= n1; i++){
|
||||
|
||||
// 这里pre相当于 dp[i - 1][j - 1]
|
||||
int pre = dp[0];
|
||||
for(int j = 1; j <= n2; j++){
|
||||
|
||||
//用于给pre赋值
|
||||
int cur = dp[j];
|
||||
if(text1.charAt(i - 1) == text2.charAt(j - 1)){
|
||||
//这里pre相当于dp[i - 1][j - 1] 千万不能用dp[j - 1] !!
|
||||
dp[j] = pre + 1;
|
||||
} else{
|
||||
// dp[j] 相当于 dp[i - 1][j]
|
||||
// dp[j - 1] 相当于 dp[i][j - 1]
|
||||
dp[j] = Math.max(dp[j], dp[j - 1]);
|
||||
}
|
||||
|
||||
//更新dp[i - 1][j - 1], 为下次使用做准备
|
||||
pre = cur;
|
||||
}
|
||||
}
|
||||
|
||||
return dp[n2];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Python:
|
||||
|
Reference in New Issue
Block a user