栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

序列自动机:重复子序列问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

序列自动机:重复子序列问题

序列自动机:重复子序列问题 问题:


思路:

  我们可以用序列自动机来判断子序列,如何处理A可重复的问题呢?我们并不需要真的重复A,当我们用序列自动机判断某个元素不存在时,A重复后该元素可能会出现(即该元素在遍历位置之前),因此我们重新回到位置1开始继续找寻该元素即可,同时重复次数+1
  如何判断无论重复多少次都不可能为子序列?若A无论重复多少次,B都不会是A的子序列,则表明B中含有A中没有的字符(若B中的字符A中都有,则进行多次重复后,一定能在A中找到B中对应的字符)。那么如何判断B中是否含有A中没有的字符呢?我们不需使用set保存出现的字符,利用序列自动机,若在位置1调用Next[1][]都找不到该字符的时候,就说明整个A串都不包含该字符,返回-1即可

代码:
import java.util.*;

public class Main {
    static int[][] next = new int[100002][26];
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String A, B;
        int i, j;
        while (scanner.hasNext()) {
            A = scanner.next();
            B = scanner.next();
            Arrays.fill(next[A.length() + 1], 0);
            for (i = A.length();i >= 1;i--) {
                for (j = 0;j < 26;j++) {
                    next[i][j] = next[i + 1][j];
                }
                next[i][A.charAt(i - 1) - 'a'] = i;
            }
            System.out.println(check(B));
        }

    }

    static int check(String B) {
        int i, ans = 1, pos = 1, temp;
        for (i = 0;i < B.length();i++) {
            temp = next[pos][B.charAt(i) - 'a'];
            if (temp == 0) {
                if (pos == 1) {
                    return -1;
                }
                ans++;
                i--;
                pos = 1;
            } else {
                pos = temp + 1;
            }
        }
        return ans;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/293335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号