String 将一个字符串转换为另一个给定约束
给定两个字符串,s1和s2。Len(s2)String 将一个字符串转换为另一个给定约束,string,algorithm,String,Algorithm,给定两个字符串,s1和s2。Len(s2)
- s2=s2+a
- s2=版本(s2)+“b”
有更好的解决方案吗?反向工作。不要从
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)的最简单答案。在我发布问题之前,面试也结束了。我在面试中答不上来。