Hard-题目33:97. Interleaving String

本文介绍了一个使用动态规划解决字符串交错匹配问题的算法。通过分析如何判断一个字符串是否由另外两个字符串交错组成,给出了详细的实现过程及代码示例。

题目原文:
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.
题目大意:
给出三个字符串s1,s2,s3,判断s3是不是s1和s2交错组合而成。
题目分析:
很明显这个问题可以缩减为下面的子问题:s1的前i个字符与s2的前j个字符能否交错构成s3的前i+j个字符。那么就用DP来做。
设dp(i,j)表示s1的前i个字符与s2的前j个字符能否交错构成s3的前i+j个字符。那么转移关系如下:

dp(I,j)=(dp(i-1,j)&&s1[i-1]==s3[i+j-1])||(dp(I,j-1)&&s2[j-1]==s3[i+j-1])

很好理解,如果dp(i-1,j)==true,则只需要看s3的第i+j个字符和s1的第i个字符是否一样,dp(I,j-1)==true的情况也同理。时间复杂度仅为O(s1.length*s2.length).
源码:(language:cpp)

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int m = s1.size();
        int n = s2.size();
        if(m+n != s3.size())
            return false;
        vector<vector<bool> > path(m+1, vector<bool>(n+1, false));
        for(int i = 0; i < m+1; i ++)
        {
            for(int j = 0; j < n+1; j ++)
            {
                if(i == 0 && j == 0)
                // start
                    path[i][j] = true;
                else if(i == 0)
                    path[i][j] = path[i][j-1] & (s2[j-1]==s3[j-1]);
                else if(j == 0)
                    path[i][j] = path[i-1][j] & (s1[i-1]==s3[i-1]);
                else
                    path[i][j] = (path[i][j-1] & (s2[j-1]==s3[i+j-1])) || (path[i-1][j] & (s1[i-1]==s3[i+j-1]));
            }
        }
        return path[m][n];
    }
};

成绩:
12ms,8.48%,8ms,28.70%

RTSS-6-1-10-v19.12 BACKCHANNEL STREAMING BY POST – G.711 (RTP-Unicast/RTSP/HTTP/TCP, IPv4) STEP 1 - Getting media service address StepStart: 2025-10-26T07:27:57.3561981Z Transmit done Receive done STEP PASSED STEP 2 - Connect to Media service StepStart: 2025-10-26T07:27:57.4746039Z Media service address: http://192.168.137.185:2020/onvif/service STEP PASSED STEP 3 - Getting media profiles StepStart: 2025-10-26T07:27:57.4830953Z Transmit done Receive done STEP PASSED STEP 4 - Get audio decoder configuration options StepStart: 2025-10-26T07:27:57.6665818Z Transmit done Receive done STEP PASSED STEP 5 - Get Stream URI StepStart: 2025-10-26T07:27:57.7587085Z Transmit done Receive done Stream URI = http://192.168.137.185:554/stream1 STEP PASSED STEP 6 - Getting media service address StepStart: 2025-10-26T07:27:57.8242886Z Transmit done Receive done STEP PASSED STEP 7 - Check if the stream uri has correct IP type StepStart: 2025-10-26T07:27:57.9170889Z STEP PASSED STEP 8 - Check if the stream uri has the same scheme with the web service StepStart: 2025-10-26T07:27:57.9181707Z STEP PASSED STEP 9 - Describe StepStart: 2025-10-26T07:27:58.0325891Z Transmit done Receive done Receive done STEP PASSED STEP 10 - Check of IP address type in response to RTSP DESCRIBE StepStart: 2025-10-26T07:27:58.5598325Z STEP PASSED STEP 11 - Create Media Session StepStart: 2025-10-26T07:27:58.5620254Z Initiated the backchannel subsession PCMU STEP PASSED STEP 12 - Setup StepStart: 2025-10-26T07:27:58.5685404Z Transmit done Receive done STEP PASSED STEP 13 - Create Sinks StepStart: 2025-10-26T07:27:58.8905724Z Created a data sink for the backchannel subsession STEP PASSED STEP 14 - Play StepStart: 2025-10-26T07:27:58.9213815Z Transmit done Receive done Protocol error 400 in 400 Bad Request STEP FAILED TEST FAILED 解释报错
10-27
Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计原则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值