算法训练——字符串映射

该博客探讨了一种使用深度优先搜索(DFS)解决字符串匹配问题的方法。在给定的模式和字符串中,通过建立字符到字符串的双射映射,判断是否存在匹配。示例展示了如何应用此方法来检查字符串是否符合特定的模式。博客还提供了一个Java代码实现,用于分割字符串并检查匹配情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日一练

        给你一种规律 pattern 和一个字符串 s,请你判断 s 是否和 pattern 的规律相匹配。
如果存在单个字符到字符串的 双射映射 ,那么字符串 s 匹配 pattern ,即:如果pattern 中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s 。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。

示例 1:
        输入:pattern = "abab", s = "redblueredblue"输出:true解释:一种可能的映射如下:'a' -> "red"'b' -> "blue"

示例 2:
        输入:pattern = "aaaa", s = "asdasdasdasd"输出:true解释:一种可能的映射如下:'a' -> "asd"

示例 3:
        输入:pattern = "aabb", s = "xyzabcxzyabc"输出:false

提示:
        1 <= pattern.length, s.length <= 20pattern 和 s 由小写英文字母组成

解答:采用dfs分割子串

public class Day7 {
    public static void main(String[] args) {
//        String s = "abcabc";
//        new Day7().solution("aa",s,0,0);
//        new Day7().solution("abab","redblueredblue",0,0);
//        new Day7().solution("abab","xyzabcxzyabc",0,0);
        new Day7().solution("aaaa","asdasdasdasd",0,0);
        System.out.println(flag);

    }


    ArrayList<String> list = new ArrayList<>();
    static boolean flag = false;
    //暴力切割成指定块,找到匹配的一次,若没有,那么返回false
    public void solution(String s, String pattern, int start, int deep) {
        if (flag) return;
        if (deep == s.length() ) {//一一比对
            for (int i = 0; i < s.length(); i++) {
                for (int j = i + 1; j < s.length(); j++) {
                    if (s.charAt(i) == s.charAt(j)) {
                        if (list.get(i) != null && !list.get(i).equals(list.get(j))) {
                            return;
                        }
                    }
                }
            }
            flag = true;
            return;
        }

        for (int i = start; i < pattern.length() - s.length() + deep + 1; i++) {
            if (deep == s.length() - 1){
                list.add(pattern.substring(start).intern());
                solution(s, pattern, i + 1, deep + 1);
                list.remove(deep);
                break;
            }
            list.add(pattern.substring(start, i + 1).intern());
            solution(s, pattern, i + 1, deep + 1);
            list.remove(deep);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aristocrat l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值