Leetcode392. 判断子序列
class Solution {
public :
bool isSubsequence ( string s, string t) {
int k = 0 ;
for ( auto c : t)
if ( k < s. size ( ) && c == s[ k] )
k ++ ;
return k == s. size ( ) ;
}
} ;
Leetcode1143. 最长公共子序列
class Solution {
public :
int longestCommonSubsequence ( string s1, string s2) {
int n = s1. size ( ) , m = s2. size ( ) ;
s1 = ' ' + s1;
s2 = ' ' + s2;
vector< vector< int >> f ( n + 1 , vector< int > ( m + 1 ) ) ;
for ( int i = 1 ; i <= n; i ++ )
for ( int j = 1 ; j <= m; j ++ )
{
f[ i] [ j] = max ( f[ i - 1 ] [ j] , f[ i] [ j - 1 ] ) ;
if ( s1[ i] == s2[ j] )
f[ i] [ j] = max ( f[ i] [ j] , f[ i - 1 ] [ j - 1 ] + 1 ) ;
}
return f[ n] [ m] ;
}
} ;
Leetcode72. 编辑距离
class Solution {
public :
int minDistance ( string s1, string s2) {
int n = s1. size ( ) , m = s2. size ( ) ;
s1 = ' ' + s1;
s2 = ' ' + s2;
vector< vector< int >> f ( n + 1 , vector< int > ( m + 1 ) ) ;
for ( int j = 0 ; j <= m; j ++ ) f[ 0 ] [ j] = j;
for ( int i = 1 ; i <= n; i ++ ) f[ i] [ 0 ] = i;
for ( int i = 1 ; i <= n; i ++ )
for ( int j = 1 ; j <= m; j ++ ) {
f[ i] [ j] = min ( f[ i - 1 ] [ j] , f[ i] [ j - 1 ] ) + 1 ;
int t = s1[ i] != s2[ j] ;
f[ i] [ j] = min ( f[ i] [ j] , f[ i - 1 ] [ j - 1 ] + t) ;
}
return f[ n] [ m] ;
}
} ;