首页 > 试题广场 >

判断子序列

[编程题]判断子序列
  • 热度指数:2833 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串 S 和 T ,判断 S 是否是 T 的子序列。
即是否可以从 T 删除一些字符转换成 S。

数据范围: ,保证字符串中仅含有小写字母
示例1

输入

"nowcoder","nowcoder"

输出

true
示例2

输入

"nower","nowcoder"

输出

true
示例3

输入

"nowef","nowcoder"

输出

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();
    }
}

发表于 2023-01-25 22:58:03 回复(0)
public static boolean nc228(String s, String t) {
        boolean[][] dp = new boolean[s.length() + 1][t.length() + 1];
        Arrays.fill(dp[0], true);
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 1; j <= t.length(); 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()];
    }
发表于 2022-07-01 10:33:59 回复(0)

	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;
	}


编辑于 2022-06-07 22:13:08 回复(0)
public boolean isSubsequence(String S, String T) {
        // write code here
        int i = 0, j = 0;
        int count = 0;
        while (i < S.length() && j < T.length()) {
            if (S.charAt(i) == T.charAt(j++)) {
                count++;
                i++;
            }
        }
        return count == S.length();
    }

发表于 2022-06-06 15:00:05 回复(0)

双指针

一个指针p1指向S的首个字符,另一个指针p2指向T的首个字符。如果字符相等,两个指针都移动;否则只移动p2指针。直到遍历完某个字符串,如果p1到了S的结尾,就说明S是T的子序列。时间复杂度为O(n),其中n为T的长度。
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;
    }
}

动态规划

检查S和T的最长公共子序列的长度是否为S.length()。时间复杂度O(m*n),其中m为S的长度。
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();
    }
};

编辑于 2021-12-15 09:47:26 回复(0)

问题信息

难度:
5条回答 3610浏览

热门推荐

通过挑战的用户

查看代码