题目
1.描述
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
2.示例
s = "abc", t = "ahbgdc"
, 返回 true
s = "axc", t = "ahbgdc"
, 返回false
3.思路
可使用双指针法或动态规划法, 动态规划法的时间/空间复杂度相对较高.
4.代码
- 双指针法
public static boolean isSubsequence(String s, String t) { if (t == null || s == null) return false; if (s.length() == 0) return true; int tLen = t.length(); int sLen = s.length(); int sIndex = 0; for (int i = 0; i < tLen; i++) { char c1 = t.charAt(i); char c2 = s.charAt(sIndex); if (c1 == c2) { sIndex++; } if (sIndex == sLen) return true; } return false; }
- 动态规划法, 讲解链接
public static boolean isSubsequence_dp(String s, String t) { boolean[][] dp = new boolean[s.length() + 1][t.length() + 1]; for (int col = 0; col < dp[0].length; col++) { dp[0][col] = true; } for (int row = 1; row < dp.length; row++) { char c1 = s.charAt(row - 1); for (int col = 1; col < dp[row].length; col++) { char c2 = t.charAt(col - 1); if (c1 == c2) { dp[row][col] = dp[row - 1][col - 1]; } else { dp[row][col] = dp[row][col - 1]; } } } return dp[s.length()][t.length()]; }