判断字符串子序列

    /*
     * 判断字符串子序列
     * 给定字符串 target和 source, 判断 target 是否为 source 的子序列。
     * 你可以认为 target 和 source 中仅包含英文小写字母。字符串 source可能会很长(长度 ~= 500,000),而 target 是个短字符串(长度 <=100)。
     * 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"abc"是"aebycd"的一个子序列, 而"ayb"不是)。
     * 请找出最后一个子序列的起始位置。
     * 输入描述:
     * 第一行为target,短字符串(长度 <=100)
     * 第二行为source,长字符串(长度 ~= 500,000)
     * 输出描述:
     * 最后一个子序列的起始位置, 即最后一个子序列首字母的下标
     * 示例1
     * 输入
     * abc
     * abcaybec
     * 输出
     * 3
     * 说明
     * 这里有两个abc的子序列满足,取下标较大的,故返回3
     * 备注:
     * 若在source中找不到target,则输出-1
     */
    
    //解题方法:双指针法, 题目要求返回下标最大的字串,可以用倒序遍历字符串,返回第一个结果
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String t = sc.nextLine();    //target
        String s = sc.nextLine();    //source
        //声明2个指针, 分别指向source,target最后一位
        int ti = t.length()-1;
        int si = s.length()-1;
        while (ti >=0 && si >=0) {
            //如果指针所指位置字符相等,两个指针都左移一位,否则只将source指针左移一位
            if (t.charAt(ti) == s.charAt(si)) {    
                if (ti == 0) {
                    System.out.println("倒序搜索第一个子串完成");
                    System.out.println(si);
                    return;
                }
                ti--;
            }
            si--;
        }
        System.out.println(-1);
    }

返回:

 

posted @ 2022-05-26 17:46  WPMA  阅读(556)  评论(0编辑  收藏  举报