目录
392.判断子序列(简单)
题目链接:392. 判断子序列
1. 双指针
双指针遍历两个字符串,直到其中任意一个串结束,如果s串到达末尾,则s串一定是t串的子序列。
bool isSubsequence(char * s, char * t){
char* slogan_s=s;
char* slogan_t=t;
int k=0;
while(*slogan_t!='\0'&&*slogan_s!='\0'){
if(*slogan_t==*slogan_s){
slogan_t++;slogan_s++;
}else{
slogan_t++;
}
}
if(*slogan_s=='\0'){
return true;
}
return false;
}
2. 动态规划
bool isSubsequence(char * s, char * t){
//dp数组从dp[1][1]开始推,所以补充s串为空的情况
if(strlen(s)==0) return true;
int row=strlen(s)+1,column=strlen(t)+1;
int dp[row][column];
//初始化
for(int i=0;i<row;i++){
dp[i][0]=0;
}
for(int i=0;i<column;i++){
dp[0][i]=0;
}
for(int i=1;i<row;i++){
for(int j=1;j<column;j++){
if(s[i-1]==t[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=dp[i][j-1];
}
if(dp[i][j]==strlen(s)){
return true;
}
}
}
return false;
}
115.不同的子序列 (困难)
题目链接:115. 不同的子序列
注意:
- dp[i][j]中的数字可能很大,试图定义为long long类型还是不行,看了题解改为了unit64_t类型通过。
- 初始化的时候,注意覆盖的顺序,dp[0][0]的数值应该是1。
int numDistinct(char * s, char * t){
int row=strlen(s)+1,column=strlen(t)+1;
uint64_t dp[row][column];
for(int i=0;i<row;i++){
dp[i][0]=1;
}
//dp[0][0]仍然是1,不被覆盖成0
for(int j=1;j<column;j++){
dp[0][j]=0;
}
for(int i=1;i<row;i++){
for(int j=1;j<column;j++){
if(s[i-1]==t[j-1]){
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[row-1][column-1];
}