题目描述:
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
示例 1:
s = “abc”, t = “ahbgdc”
返回 true.
示例 2:
s = “axc”, t = “ahbgdc”
返回 false.
和最长公共子序列很像,就不详细解释了。
C++代码如下:
class Solution {
public:
bool isSubsequence(string s, string t) {
int n=s.size();
int m=t.size();
vector<vector<int> >dp(n+1,vector<int>(m+1,0));//生成一个二维数组,并赋初值为0
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i-1]==t[j-1]){//注意是i-1和j-1而不是i和j
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
if(dp[n][m]==n){
return true;
}
else {
return false;
}
}
};
JAVA代码如下:
class Solution {
public boolean isSubsequence(String s, String t) {
int index = -1;
boolean flag=true;
for (char c : s.toCharArray()){
index = t.indexOf(c, index+1);
if (index == -1){
flag=false;
}
}
return flag;
}
}
class Solution {
public boolean isSubsequence(String s, String t) {
int n = s.length(), m = t.length();
int i = 0, j = 0;
while (i < n && j < m) {
if (s.charAt(i) == t.charAt(j)) {
i++;
}
j++;
}
return i == n;
}
}
执行结果: