组合数组中的字符串

题目描述:

给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。
示例 1:输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:输入:s = “wordgoodgoodgoodbestword”, words = [“word”,“good”,“best”,“word”]
输出:[]
示例 3:输入:s = “barfoofoobarthefoobarman”, words = [“bar”,“foo”,“the”]
输出:[6,9,12]

解法

回潮法求出所有组合,然后用每个组合在字符串s中查找出现的位置。

代码java

public class T4 {

    public static void main(String[] args) {
        T4 t = new T4();
        String word = "wordgoodgoodgoodbestword";
        String[] words = new String[] { "word", "good", "best", "word" };
        int[] used = new int[words.length];
        t.dfs(0, words, used);
        List<Integer> list = new ArrayList<>();

        t.result.forEach((item) -> {
            int indexOf = word.indexOf(item);
            System.out.println(item);
            if (indexOf > -1) {
                list.add(indexOf);
            }
        });
        for (Integer list2 : list) {
            System.out.println(list2);
        }

    }

    Set<String> result = new HashSet<>();
    LinkedList<String> path = new LinkedList<>();
    Set<Integer> set = new HashSet<>();

    void dfs(int index, String[] words, int[] used) {
        if (path.size() == words.length) {
            result.add(convertStr(path));
            return;
        }
        for (int i = 0; i < words.length; i++) {
            if (used[i] == 1) {
                continue;
            }
            path.add(words[i]);
            used[i] = 1;
            dfs(i + 1, words, used);
            path.removeLast();
            used[i] = 0;
        }
    }

    String convertStr(LinkedList<String> path) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < path.size(); i++) {
            sb.append(path.get(i));
        }
        return sb.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值