字符串匹配中问题 给定字符串 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 的子序列。在这种情况下,你会怎样改变代码? 致谢: 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/is-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 package it.cast.demo8; 字符匹配一开始就是暴力这样会使时间复杂度比较高 我使用字符串next值使得母串不回硕,直接是子串回到next值开始。 public class Solution { public static void main(String[] args) { String d="axc"; String f="ahgdbc"; boolean a = isSubsequence(d, f); System.out.println(a); } public static boolean isSubsequence(String s, String t) { if(s.length()>t.length())//子串比母串还要长直接false { return false; } int[] n = new int[110];//next数组 n[0] = 0; n[1] = 1; int m = s.length(); int w=0; for (int i = 2; i < m; i++) { w = n[i - 1] - 1;//求next值时i-1的字符要和w进行比较 int p = i-1;//第一个相等就使用i-1的下标,否则使用w+1; while (w >= 0) {//一直往前找到相等字符或结束 if (s.charAt(i - 1) == s.charAt(w)) {//字符相等就让被比较的字符所带next值+1; n[i] = n[p] + 1; break; } else { p=w+1; w--; } } if(w<0){ n[i]=1; } } int j = 0,l=0; for(int i = 0; i < t.length(); i++){ l = 0; while(j < m&&i<t.length()){ if(t.charAt(i)==s.charAt(j)){ l++; i++; j++; if(l==m) break; } else i++; } j=n[j]; if(l==m){ break; } } // System.out.println(l+" "+m); if(l==m) return true; else return false; } }
字符串匹配问题
最新推荐文章于 2022-09-11 01:30:28 发布