String 将一个字符串转换为另一个给定约束

String 将一个字符串转换为另一个给定约束,string,algorithm,String,Algorithm,给定两个字符串,s1和s2。Len(s2)

给定两个字符串,s1和s2。Len(s2) 两个字符串都只有“a”和“b”字符。给定2个操作:

  • s2=s2+a
  • s2=版本(s2)+“b”
通过执行上述两个操作,确定s2是否等于s1

我只能想到一个简单的解决方案,我们可以递归地对s2执行上面提到的两个操作,每当两个字符串的长度相等时,我们就可以检查s2=s1

但原始解的时间复杂度是指数的:(2^len_diff),其中len_diff是两个字符串长度的差


有更好的解决方案吗?

反向工作。不要从
s2
中构建
s1
,而是从
s1
的末尾剥离字符。这样,您就可以确定要撤消的操作。如果您最终得到了s2,那么您就完成了。

反向工作。不要从
s2
中构建
s1
,而是从
s1
的末尾剥离字符。这样,您就可以确定要撤消的操作。如果最终得到的结果是s2,那么就完成了。

因此,假设答案存在,s1的形式为:

(s2a*),(a*bs2a*ba*),(a*ba*bs2a*ba*ba*)

还是形式

(a*s'2ba*),(a*ba*s'2ba*ba*)

其中s'2与s2相反


因此,您的问题归结为查找正则表达式

s1=[(a*b)n s2(a*b)n a*]V[a*(ba*)n s'2(ba*)n+1]

这是真的。您可以使用正则表达式库来解析和检查它


如果您必须从头开始编写解析算法,您甚至不必检查*。只需计算s2两侧的b的数量,您就可以逃脱处罚

伪代码类似于

B1 = number of b's in s2 //O(n)
B2 = number of b's in s1 //O(n)

//Locate s2 in s1 and check b_left = b_right and character before s2 is b

b_to_left = 0

for i from 1 to (s1's length - s2's length): //O(n iteration)
    if s2.length characters of s1 starting at index i DO NOT match s2: //At worse O(n to check)
        if(s1[i] is b) b_to_left++
        continue to next i

    b_to_right = B1 - B2 - b_to_left
    if(b_to_left == b_to_right) :
        if(b_to_left == 0)  RETURN TRUE
        else if(s[i-1] is b) RETURN TRUE
    
    if(s1[i] is b) b_to_left++


//Similarly run another round and parse for the second type involving reverse of s2
//I'm leaving that out as an exercise for you since you mentioned it's an interview problem 




RETURN FALSE


时间:O(n2)


空格:O(1)

因此假设答案存在,s1的形式为:

(s2a*),(a*bs2a*ba*),(a*ba*bs2a*ba*ba*)

还是形式

(a*s'2ba*),(a*ba*s'2ba*ba*)

其中s'2与s2相反


因此,您的问题归结为查找正则表达式

s1=[(a*b)n s2(a*b)n a*]V[a*(ba*)n s'2(ba*)n+1]

这是真的。您可以使用正则表达式库来解析和检查它


如果您必须从头开始编写解析算法,您甚至不必检查*。只需计算s2两侧的b的数量,您就可以逃脱处罚

伪代码类似于

B1 = number of b's in s2 //O(n)
B2 = number of b's in s1 //O(n)

//Locate s2 in s1 and check b_left = b_right and character before s2 is b

b_to_left = 0

for i from 1 to (s1's length - s2's length): //O(n iteration)
    if s2.length characters of s1 starting at index i DO NOT match s2: //At worse O(n to check)
        if(s1[i] is b) b_to_left++
        continue to next i

    b_to_right = B1 - B2 - b_to_left
    if(b_to_left == b_to_right) :
        if(b_to_left == 0)  RETURN TRUE
        else if(s[i-1] is b) RETURN TRUE
    
    if(s1[i] is b) b_to_left++


//Similarly run another round and parse for the second type involving reverse of s2
//I'm leaving that out as an exercise for you since you mentioned it's an interview problem 




RETURN FALSE


时间:O(n2)


空格:O(1)

这是来自编码竞赛吗?@abhay不,这不是来自任何竞赛。我在一次采访中被问到这个问题。这是来自一个编码比赛吗?@abhay不,这不是来自任何比赛。我在一次采访中被问到这个问题。这似乎是最简单的答案,而且似乎没有任何问题。有人能确认这是不是正确的答案吗?这似乎是最简单的答案,似乎也没有任何问题。有人能确认这是否是正确的答案吗?是的,这似乎是正确的方法,只是想知道用户58697的答案是否正确,在这种情况下,这将是时间复杂度为O(n)的最简单答案。在我发布问题之前,面试也结束了。我无法在面试中回答。是的,这似乎是正确的方法,只是想知道用户58697的答案是否正确,在这种情况下,这将是时间复杂度为O(n)的最简单答案。在我发布问题之前,面试也结束了。我在面试中答不上来。