[leetcode-97]Interleaving String(java)

问题描述:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = “aabcc”,
s2 = “dbbca”,

When s3 = “aadbbcbcac”, return true.
When s3 = “aadbbbaccc”, return false.

分析:这道题,我觉得是比较难的。我最开始的想法是使用递归,但是觉得递归可能会超时,就利用两个指针吗,齐头并进,当遇到二者相等时,就把中间状态存到栈里面。如果以后走不通了,就出栈,恢复状态。再继续查找,恢复等等,当数据小规模时,可以work,但是数据量一大就TLE。
于是使用二维DP算法(早该想到)。其核心的状态转移方程为:
f(i,j) = s1[i-1][j]==s3[i+j-1] && f[i-1,j] || (s2[i][j-1]==s3[i+j-1] && f[i][j-1])

代码如下:324ms

public class Solution {
        public boolean isInterleave(String s1, String s2, String s3) {
        int row = s1.length();
        int col = s2.length();
        int length = s3.length();
        if(row+col!=length)
            return false;
        if(row==0)
            return s2.equals(s3);
        else if(col==0)
            return s1.equals(s3);

        boolean[][] matrix = new boolean[row+1][col+1];
        matrix[0][0] = true;

        for(int i = 0;i<=row;i++){
            for(int j = 0;j<=col;j++){

                if(i>0){
                    matrix[i][j] = s1.charAt(i-1)==s3.charAt(i+j-1) && matrix[i-1][j];
                }
                if(j>0)
                    matrix[i][j] |= s2.charAt(j-1)==s3.charAt(i+j-1) && matrix[i][j-1];
            }
        }
        return matrix[row][col];
    }
}

代码1:TLE

    class Node{
        int index1;
        int index2;
        int index3;
        public Node(int index1,int index2,int index3){
            this.index1 = index1;
            this.index2 = index2;
            this.index3 = index3;
        }
    }
    public boolean isInterleave2(String s1, String s2, String s3) {
        int s1Len = s1.length();
        int s2Len = s2.length();
        int index1=0,index2=0,index3 = 0;
        Stack<Node> nodes = new Stack<>();

        char[] s1Array = s1.toCharArray();
        char[] s2Array = s2.toCharArray();
        char[] s3Array = s3.toCharArray();

        while(index1<s1Len || index2<s2Len){
            if( (index1>=s1Len || s3Array[index3]!=s1Array[index1]) && (index2>=s2Len ||s3Array[index3] != s2Array[index2])){
                if(nodes.empty())
                    return false;
                Node tmpNode = nodes.pop();
                index1 = tmpNode.index1;
                index2 = tmpNode.index2;
                index3 = tmpNode.index3;
                index2++;index3++;
            }
            else{
                if(index1<s1Len && s3Array[index3]==s1Array[index1]){
                    if(index2<s2Len && s1Array[index1]==s2Array[index2]){
                        Node node = new Node(index1,index2,index3);
                        nodes.push(node);
                    }
                    index1++;
                    index3++;
                }else if(index2<s2Len && s3Array[index3]==s2Array[index2]) {
                    index2++;
                    index3++;
                }else
                    return false;
            }
        }
        return true;
    }

代码2:递归TLE

//使用递归的思想来进行
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1.length()<=0)
            return s2.equals(s3);
        if(s2.length()<=0)
            return s1.equals(s3);
        if(s3.length()<=0)
            return false;

        if(s1.charAt(0)==s3.charAt(0)&&s2.charAt(0)!=s3.charAt(0))
            return isInterleave(s1.substring(1),s2,s3.substring(1));
        else if(s2.charAt(0)==s3.charAt(0)&&s1.charAt(0)!=s3.charAt(0))
            return isInterleave(s1,s2.substring(1),s3.substring(1));
        else if(s1.charAt(0)==s2.charAt(0)&&s1.charAt(0)==s3.charAt(0)){
            return isInterleave(s1.substring(1),s2,s3.substring(1))||isInterleave(s1,s2.substring(1),s3.substring(1));
        }else
            return false;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值