给定两个字符串 S 和 T ,判断 S 是否是 T 的子序列。
即是否可以从 T 删除一些字符转换成 S。
数据范围:
,
,保证字符串中仅含有小写字母
class Solution {
public:
bool isSubsequence(string S, string T) {
vector<int>dp(S.size()+1);
for(int i=1;i<=S.size();i++)
{
for(int j=i;j<=T.size();j++)
{
if(S[i-1]==T[j-1])
{dp[i]=max(dp[i],dp[i-1]+1);break;}
}
}
if(dp[S.size()]==S.size())return true;
return false;
}
}; import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
public boolean isSubsequence (String S, String T) {
// write code here
if(S.length() > T.length()) return false;
int p1 = 0, p2 = 0;
while(p1 < S.length() && p2 < T.length()){
if(S.charAt(p1) == T.charAt(p2)){
p1++;
p2++;
}else{
p2++;
}
}
if(p1 == S.length()) return true;
return false;
}
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
bool isSubsequence(string S, string T) {
// write code here
int maxLen = 0;
vector<vector<int>> dp(S.length() + 1, vector<int>(T.length() + 1));
for(int i = 1; i <= S.length(); i++){
for(int j = 1; j <= T.length(); j++){
if(S[i - 1] == T[j - 1]){
dp[i][j] = dp[i - 1][j - 1] + 1;
}else{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
maxLen = maxLen > dp[i][j]? maxLen: dp[i][j];
}
}
return maxLen == S.length();
}
}; import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
public boolean isSubsequence (String S, String T) {
int lenS = S.length();
int lenT = T.length();
int i = 0;
int j = 0;
while (i < lenS && j < lenT) {
char chS = S.charAt(i);
char chT = T.charAt(j);
if (chS == chT) {
i++;
j++;
} else {
j++;
}
}
if (i == lenS) {
return true;
}
return false;
}
} from operator import index # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param S string字符串 # @param T string字符串 # @return bool布尔型 # class Solution: def isSubsequence(self , S: str, T: str) -> bool: # write code here index = 0 for s in T: if S[index] == s: index += 1 if index == len(S): return True if index == len(S): return True return False
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
public boolean isSubsequence (String S, String T) {
// write code here
// S是否是T的子序列
// dp[i][j] S的 0 - i 是否是 T的 0 - j 的子序列
boolean[][] dp = new boolean[S.length() + 1][T.length() + 1];
dp[0][0] = true;
for(int i = 0; i < T.length(); i++) {
dp[0][i] = true;
}
for(int i = 1; i < S.length() + 1; i++) {
for(int j = 1; j < T.length() + 1; j++) {
if(S.charAt(i - 1) == T.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
return dp[S.length()][T.length()];
}
} struct Solution{
}
impl Solution {
fn new() -> Self {
Solution{}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
pub fn isSubsequence(&self, S: String, T: String) -> bool {
// write code here
self.check(&S[..], &T[..])
}
fn check(&self, s: &str, t: &str) -> bool {
if s == "" && t == "" {return true}
if s == "" {return false}
if t == "" {return false}
if s[0 ..= 0] == t[0 ..= 0] {
self.check(&s[1 ..], &t[1 ..])
} else {
self.check(s, &t[1 ..])
}
}
} 动态规划:
f[i][j]:S中前i个字符 是否是T中前j个字符的子序列
public boolean isSubsequence (String S, String T) {
// write code here
int len1 = S.length();
int len2 = T.length();
if(len1 > len2) return false;
boolean[][] f = new boolean[len1 + 1][len2 + 1];
for(int i=0;i<=len2;i++){
f[0][i] = true; // 如果S为空,则一定是T的子串
}
// f[i][j]: S中前i个字符 是否是T中前j个字符的子序列
// 递推:
// 由于S中的每个字符都是要匹配的,而T中某些字符可以不需要,因此:
// if S[i] == T[j], f[i][j] = f[i-1][j-1]
// else f[i][j] = f[i][j-1] 即不用T[j]
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(S.charAt(i-1) == T.charAt(j-1)){
f[i][j] |= f[i-1][j-1];
}
else{
f[i][j] = f[i][j-1];
}
}
}
return f[len1][len2];
}
''' 这道题要不是在leetcode看过, 就没遇见出题人这么**, 都不好好出题或者直接从别的地方照搬。条件加上不改变相对位置。 思路: 1. 首先判断子串S的长度是否大于原串T的长度,若是则无法匹配,直接返回False。 2. 定义一个变量match_s表示匹配到的字符,一个变量ind_S表示子串S的当前索引。然后遍历原串T中的每一个字符,如果该字符与子串S当前索引指向的字符相同,则将该字符加入match_s中,并将ind_S加一。 3. 最后判断match_s是否等于子串S,若是则匹配成功,返回True,否则返回False。 ''' class Solution: def isSubsequence(self , S: str, T: str) -> bool: # write code here if len(S) > len(T): return False match_s = '' # 匹配到的字符 ind_S = 0 # 子串S的索引 for j in T: if j == S[ind_S]: match_s += j ind_S += 1 if match_s == S: return True return False
package main
import _"fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
func isSubsequence( S string , T string ) bool {
for _,ch:=range []byte(T){
if len(S)==0{
return true
}
if S[0]==ch{
S=S[1:]
}
}
if len(S)==0{
return true
}
return false
} import java.util.*;
public class Solution {
/**
*
* S字符先后顺序和T中一致
*
* @param S string字符串
* @param T string字符串
* @return bool布尔型
*/
public boolean isSubsequence (String S, String T) {
// write code here
if (S.equals(T) || T.contains(S)) return true;
LinkedList<Character> linkedList = new LinkedList<>();
//一次进入队列
for (int i = 0; i < S.length(); i++) {
linkedList.offer(S.charAt(i));
}
//遍历T
for (int i = 0; i < T.length(); i++) {
if (linkedList.isEmpty()) return true;
//遇到相同字符弹出
if (T.charAt(i) == linkedList.peek()) {
linkedList.poll();
}
}
//最后判断队列是否为空
return linkedList.isEmpty();
}
}
public boolean isSubsequence (String S, String T) {
// write code here
if(T.indexOf(S) != -1) {
return true;
}
char[] arr = S.toCharArray();
char[] brr = T.toCharArray();
int temp = 0;
boolean flag = false;
for (int i = 0; i < arr.length; i++) {
for (int j = temp; j < brr.length; j++) {
if (arr[i] == brr[j]) {
System.out.println(j);
flag = true;
temp ++;
break;
} else {
flag = false;
}
}
}
return flag;
}
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param S string字符串 # @param T string字符串 # @return bool布尔型 # class Solution: def isSubsequence(self , S: str, T: str) -> bool: # write code here import re pattern = "" for ch in S: pattern += ch + "[a-z]*" if re.search(pattern, T) == None: return False return True