mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
@ -206,6 +206,55 @@ public:
|
|||||||
## Java
|
## Java
|
||||||
|
|
||||||
```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
|
## Python
|
||||||
@ -240,6 +289,7 @@ class Solution:
|
|||||||
## Go
|
## Go
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## JavaScript
|
## JavaScript
|
||||||
|
@ -129,6 +129,9 @@ public:
|
|||||||
Java:
|
Java:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
/*
|
||||||
|
二维dp数组
|
||||||
|
*/
|
||||||
class Solution {
|
class Solution {
|
||||||
public int longestCommonSubsequence(String text1, String text2) {
|
public int longestCommonSubsequence(String text1, String text2) {
|
||||||
int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作
|
int[][] dp = new int[text1.length() + 1][text2.length() + 1]; // 先对dp数组做初始化操作
|
||||||
@ -146,6 +149,47 @@ class Solution {
|
|||||||
return dp[text1.length()][text2.length()];
|
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:
|
Python:
|
||||||
|
Reference in New Issue
Block a user