LeetCode392. 判断子序列
思路1:双指针。每次贪心的匹配,如果匹配成功则同时右移。
☆☆☆思路2:动态规划。
代码1:
class Solution { public boolean isSubsequence(String s, String t) { // 时间复杂度: O(n+m) 空间复杂度:O(1) int si = 0, ti = 0; while (si < s.length() && ti < t.length()) { if (s.charAt(si) == t.charAt(ti)) { si ++; ti ++; }else { ti ++; } } return si == s.length(); } }
代码2:
class Solution { public boolean isSubsequence(String s, String t) { int m = s.length(), n = t.length(); if (m > n) return false; if (m == 0) return true; /** * 状态的定义1:dp[i][j]表示 s中以第i个字符结尾的字符串 是否是 t中以第j个字符结尾的字符串 的子序列 */ boolean[][] dp = new boolean[m][n]; dp[0][0] = s.charAt(0) == t.charAt(0) ? true : false; for (int j = 1; j < n; j++) { dp[0][j] = s.charAt(0) == t.charAt(j) ? true : dp[0][j-1]; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (s.charAt(i) == t.charAt(j)) { dp[i][j] = dp[i-1][j-1]; }else { dp[i][j] = dp[i][j-1]; } } } return dp[m - 1][n - 1]; /** * 状态定义2:dp[i][j]表示 s中前i个字符 是否是 t中前j个字符 的子序列 */ /* boolean[][] dp = new boolean[m + 1][n + 1]; for (int j = 0; j <= n; j++) { dp[0][j] = true; } for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; 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[m][n]; */ } }