583. 两个字符串的删除操作
这道题求得的最小步数,是这道题的变种
M
i
n
(
步数)
=
s
t
r
1.
l
e
n
g
t
h
+
s
t
r
2.
l
e
n
g
t
h
−
2
∗
(
M
a
x
(
公共字符串长度)
)
Min(步数) = str1.length + str2.length - 2 *(Max(公共字符串长度))
Min(步数)=str1.length+str2.length−2∗(Max(公共字符串长度))
class Solution {
public int minDistance(String word1, String word2) {
char[] A = word1.toCharArray();
char[] B = word2.toCharArray();
int[][] dp = new int[A.length+1][B.length+1];
for(int i=1;i<=A.length;i++){
for(int j=1;j<=B.length;j++){
if(A[i-1] == B[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
int res = A.length+B.length -2 *dp[A.length][B.length];
return res;
}
}
72. 编辑距离
d p [ i ] [ j ] dp[i][j] dp[i][j]表示s1的前 i i i个字符和说的前 j j j个字符相同所需要的最小的步数
``
class Solution {
public int minDistance(String word1, String word2) {
char[] A = word1.toCharArray();
char[] B = word2.toCharArray();
int m = A.length;
int n = B.length;
int[][] dp = new int[m+1][n+1];
for(int i=1;i<=m;i++){
dp[i][0] = i;
}
for(int j =1;j<=n;j++){
dp[0][j] = j;
}
for(int i =1;i<=m;i++){
for(int j =1;j<=n;j++){
if(A[i-1] == B[j-1]){
dp[i][j] = dp[i-1][j-1];
}else{
dp[i][j] = Math.min(dp[i][j-1], Math.min(dp[i-1][j],dp[i-1][j-1]))+1; // 增-删-改
}
}
}
return dp[m][n];
}
}
44. 通配符匹配
初始化,s=" ", p = “******”, 这样理解就知道为何需要如此初始化了
dp[i][j] = dp[i][j-1]||dp[i-1][j]; 这个理解
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
char[] A = s.toCharArray();
char[] B = p.toCharArray();
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
for(int i=1;i<=n;i++){
if(B[i-1] == '*'){
dp[0][i] = true;
}else{
break;
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(B[j-1] == '*'){
// 这里很难理解 dp[i-1][j] 是很长一串的合并项目,
dp[i][j] = dp[i][j-1]||dp[i-1][j];
}else if(B[j-1] == '?'||A[i-1]==B[j-1]){
dp[i][j] = dp[i-1][j-1];
}
}
}
return dp[m][n];
}
}
10. 正则表达式匹配
class Solution {
public boolean isMatch(String s, String p) {
char[] A = s.toCharArray();
char[] B = p.toCharArray();
int m = A.length;
int n = B.length;
boolean [][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
// 初始化:"" 和p的匹配关系初始化,a*a*a*a*a*这种能够匹配空串 ,*如果匹配0次,就表示删除前面的字符
for(int i=2;i<=n;i+=2){
if(B[i-1] =='*'){
dp[0][i] = dp[0][i-2];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(B[j-1] == '.'||A[i-1]==B[j-1]){
dp[i][j] = dp[i-1][j-1];
}
if(B[j-1] == '*'){
// 这里很难理解(dp[i-1][j]&&(A[i-1] == B[j-2]||B[j-2] == '.'));也是后面一串的简称
dp[i][j] = dp[i][j-2]||(dp[i-1][j]&&(A[i-1] == B[j-2]||B[j-2] == '.'));
}
}
}
return dp[m][n];
}
}