首页 > 其他分享 >[leetcode 87 扰乱字符串] [剪枝搜索]

[leetcode 87 扰乱字符串] [剪枝搜索]

时间:2024-05-05 09:04:19浏览次数:23  
标签:剪枝 String int s2 s1 leetcode substring split 87


import java.util.HashMap;
import java.util.Map;

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        boolean res = solution.isScramble("eebaacbcbcadaaedceaaacadccd", "eadcaacabaddaceacbceaabeccd");
        System.out.println(res);
    }
    public boolean isScramble(String s1, String s2) {
        return isRaoluanStr(s1, s2);
    }

    public boolean isSame(String s1, int from1, String s2, int from2, int len) {
        int[] arr = new int[26];
        for (int i = 0; i < len; i++) {
            arr[s1.charAt(from1 + i) - 'a']++;
            arr[s2.charAt(from2 + i) - 'a']--;
        }
        for (int i = 0; i < len; i++) {
            if (arr[s1.charAt(from1 + i) - 'a'] != 0) {
                return false;
            }
            if (arr[s2.charAt(from2 + i) - 'a'] != 0) {
                return false;
            }
        }
        return true;
    }

    public boolean isEqual(String s1, String s2, int splitIndex) {
        return isSame(s1, 0, s2, 0, splitIndex + 1)
                && isSame(s1, splitIndex + 1, s2, splitIndex + 1, s1.length() - splitIndex - 1);
    }

    public boolean isYxSame(String s1, String s2, int splitIndex) {
        // s1 y,x
        int n = s1.length();
        int xlen = splitIndex + 1;
        int ylen = n - xlen;
        String y = s1.substring(n - ylen);
        String x = s1.substring(0, xlen);
        // s2 x,y
        String x1 = s2.substring(0, ylen);
        String y1 = s2.substring(ylen);

        return isSame(y, 0, x1, 0, ylen) && isSame(x, 0, y1, 0, xlen);
    }

    Map<String,Map<String,Boolean>> map = new HashMap<>();
    public boolean isRaoluanStr(String s1, String s2) {
        if (s1.length() != s2.length()) {
            return false;
        }
        if (s1.length() == 1) {
            if (s1.charAt(0) == s2.charAt(0)) {
                return true;
            }
            return false;
        }
        if (map.get(s1) != null && map.get(s1).get(s2) != null) {
            return map.get(s1).get(s2);
        }
        // 分割
        boolean ans = false;
        int n = s1.length();
        for (int split = 0; split < n - 1; split++) {
            if (isEqual(s1, s2, split)) {
                // 可以切割s1, s2;
                ans |= isRaoluanStr(s1.substring(0, split + 1), s2.substring(0, split + 1))
                        && isRaoluanStr(s1.substring(split + 1), s2.substring(split + 1));
                if (ans) {
                   break;
                }
            }
            if (isYxSame(s1, s2, split)) {
                ans |= isRaoluanStr(s1.substring(split + 1), s2.substring(0, s1.length() - split - 1))
                        && isRaoluanStr(s1.substring(0, split + 1), s2.substring(s1.length() - split - 1));
                if (ans) {
                  break;
                }
            }
        }
        map.put(s1, map.getOrDefault(s1,new HashMap<>()));
        map.get(s1).put(s2, ans);
        map.put(s2, map.getOrDefault(s2, new HashMap<>()));
        map.get(s2).put(s1, ans);
        return ans;
    }
}

标签:剪枝,String,int,s2,s1,leetcode,substring,split,87
From: https://www.cnblogs.com/fishcanfly/p/18173197

相关文章

  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--最长连续序列
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=......
  • leetcode算法热题--盛最多水的容器
    题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释......
  • leetcode算法热题-爬楼梯
    题目假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1阶+1阶2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1阶+1阶+1阶1......
  • 347. 前 K 个高频元素(leetcode)
    https://leetcode.cn/problems/top-k-frequent-elements/description/可以考虑使用HashMap+排序,不过直接使用优先队列也挺不错,可以使用大顶堆或小顶堆classSolution{publicint[]topKFrequent(int[]nums,intk){Map<Integer,Integer>map=newHas......
  • 239. 滑动窗口最大值(leetcode)
    https://leetcode.cn/problems/sliding-window-maximum/简单的滑动窗口,但是与ACM模式的维护数组不同,在leetcode定义单调队列类更加方便classMyQueue{//单调队列实现,递减Deque<Integer>deque=newLinkedList<>();voidpoll(intval){if(!deque......
  • leetcode算法热题--字母异位词组合
    题目给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],[&q......
  • leetcode算法热题--两树之和
    题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值`target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15......
  • 【LeetCode 1648】销售价值减少的颜色球
    题目描述原题链接:LeetCode.1648销售价值减少的颜色球解题思路题意很容易理解,就是每次挑剩余同色球数量最大的颜色卖得到最大价值,总共卖orders个球的最大总价值;最快速直观暴力的解法是按照同色球数量排序,每次取数量最大值累加到总价值中并且将数量减一后重新排序,重复or......
  • leetcode(力扣) 2866. 美丽塔 II
    原题链接暴力做法(时间复杂度O(n^2))每次选取下标i为峰值,进行n次,对每次取max就可以找打答案对于i左边的序列:需要满足序列是非递减的,同时每个值尽可能大所以满足:下标为j的位置上的数<=下标是(j,i]的最小的值(等于时取得最大值),同时需要保证j位......