美团笔试(小美的优雅字符串)

/**
 * 时间限制: 3000MS
 * 内存限制: 1048576KB
 * 题目描述:
 * 一天,小美在写英语作业时,发现了一个十分优美的字符串:这个字符串没有任何两个字符相同。于是,小美随手写下了一个字符串,她想知道这个字符串的的所有子序列,有多少个是优美的。由于答案可能会很大,输出对20210101取模后的结果。
 * <p>
 * 一个字符串的子序列定义为:原字符串删除0个或多个字符后剩下的字符保持原有顺序拼接组成的字符串为原串的子序列。如:ab是acba的子序列,但bc则不是。在本题中。空串也为原串的子序列。
 * <p>
 * 两个子序列不相同,当且仅当他们对应原串的下标不相同。如aab则含有两个子序列ab。
 * 样例输入
 * aabc
 * 样例输出
 * 12
 * <p>
 * 提示
 * 有下列优美的子序列:””, ”a”, “a”, “b”, “c”, “ab”, “ab”, “bc”, “ac”, “ac”, “abc”, “abc”,一共12个。
 */
public class Main {
    private static int size = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        // long l1 = System.currentTimeMillis();
        char[] chars = str.toCharArray();
        //List<Character> characterList = new LinkedList<>();
        char[] list = new char[chars.length];
        searchStr(chars, list, 0, 0);
        System.out.println(size + 1);
//        long l2 = System.currentTimeMillis();
//        System.out.println(l2 - l1 + "ms");
    }

    private static void searchStr(char[] chars, char[] characterList, int index, int listIndex) {
        for (int i = index; i < chars.length; i++) {
            boolean flag = false;
            //如果含有这个字符就进入下一次循环 注意这里是用listIndex代表有效数组位置
            for (int j = 0; j < listIndex; j++) {
                if (characterList[j] == chars[i]) {
                    flag = true;
                    break;
                }
            }
            if (flag) continue;
            characterList[listIndex++] = chars[i];
            size++;
            size = size % 20210101;
            //测试
//            for (int j = 0; j < listIndex; j++) {
//                System.out.print(characterList[j] + " ");
//            }
//            System.out.println(" ");
            searchStr(chars, characterList, i + 1, listIndex);
            listIndex--;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值