【力扣】392. 判断子序列
给定字符串 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.
后续挑战 :
如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
第一版:
public boolean isSubsequence(String s, String t) { if (s.length() == 0){ return true; } int j = 0; // 标识s的相同字符的位置 char [] sArray = s.toCharArray(); char [] tArray = t.toCharArray(); int euqalNum = 0; for (int i = 0; i< tArray.length; i++){ if (euqalNum == sArray.length){ return true; } if (sArray[j] == tArray[i]){ j++; euqalNum++; } } return false; }
第二版:
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; }
后续挑战 :
如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
思考:
如果s足够多,而t又是固定的,那么在进行匹配的时候就应该尽可能的压缩匹配t的时间复杂度 使之时间复杂度尽量靠近O(1) 从题解下面看到一个想法
class Solution { public boolean isSubsequence(String s, String t) { // 预处理 t = " " + t; // 开头加一个空字符作为匹配入口 int n = t.length(); int[][] dp = new int[n][26]; // 记录每个位置的下一个ch的位置 for (char ch = 0; ch < 26; ch++) { int p = -1; for (int i = n - 1; i >= 0; i--) { // 从后往前记录dp dp[i][ch] = p; if (t.charAt(i) == ch + 'a') p = i; } } // 匹配 int i = 0; for (char ch : s.toCharArray()) { // 跳跃遍历 i = dp[i][ch - 'a']; if (i == -1) return false; } return true; } }
一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻