下午去蹭了一发新浪的笔试。
炒鸡多的网络基础知识,总共18道题,就写了8道左右吧,剩下的全是网络知识,这部分抽时间至少过一过。
其中一道算法题,回来跟嘟嘟商量,才发现是leetcode上的原题,连example都没有变,这可是道难度系数5的题,我嘞个去。
题目:给定三个字符串s1,s2,s3,判断s3是否能由s1和s2交错而成。
思路:
1、当s1当前字符 = s2当前字符 && s2当前字符 != s3当前字符 时,消s1.
2、同理状况 消s2.
3、难点在于当s1当前字符 = s2当前字符 =
s3当前字符时,消谁,消错了可能引发后面的错误。我当时就想,那索性都尝试一遍,于是很直接的递归的想法就这么形成的。
1 public boolean isInterleave(String s1, String s2, String s3) {
2
3 int len1 = s1.length();
4 int len2 = s2.length();
5 int len3 = s3.length();
6 if(len1 + len2 != len3) return false;
7 else return isInterleaveCore(s1 , 0 , len1 - 1 , s2 , 0 , len2 - 1 , s3 , 0 , len3 - 1);
8
9 }
10 public boolean isInterleaveCore(String s1 , int s1Start , int s1End ,
11 String s2 , int s2Start , int s2End ,
12 String s3 , int s3Start , int s3End){
13
14 int p1 = s1Start , p2 = s2Start , p3 = s3Start;
15 while(p3 <= s3End){
16 char ch3 = s3.charAt(p3);
17 if(p1 <= s1End && p2 <= s2End){
18 char ch1 = s1.charAt(p1);
19 char ch2 = s2.charAt(p2);
20 if(ch1 == ch3 && ch2 != ch3){
21 p1++;
22 p3++;
23 }else if(ch1 != ch3 && ch2 == ch3){
24 p2++;
25 p3++;
26 }else if(ch1 != ch3 && ch2 != ch3){
27 return false;
28 }else{
29 return isInterleaveCore(s1 , p1 + 1 , s1End , s2 , p2 , s2End , s3 , p3 + 1 , s3End) ||
30 isInterleaveCore(s1 , p1 , s1End , s2 , p2 + 1, s2End , s3 , p3 + 1 , s3End);
31 }
32 }else if(p1 <= s1End){
33 char ch1 = s1.charAt(p1);
34 if(ch1 != ch3) return false;
35 else{
36 p1++;
37 p3++;
38 }
39 }else if(p2 <= s2End){
40 char ch2 = s2.charAt(p2);
41 if(ch2 != ch3) return false;
42 else{
43 p2++;
44 p3++;
45 }
46 }
47 }
48 return true;
49 }
这里为自己点一个赞。第一次在考试中把递归给写出来了,证明之前的练习还是很成效的。非常( ^_^ )不错嘛。
但是这个算法过大集合时超时。其时间复杂度太高了。
网络上讲解还是要用DP。不会的心服口服。除了多练还是多练。
[leetcode]_Interleaving String,布布扣,bubuko.com
时间: 2024-12-17 02:06:27