判断字符串S是否是由字符串A和字符串B混合而成(a,b中元素顺序不变))
例
a = ‘aaaasda’
b = ‘awaae’
s = ‘aaawaasdaaae’
return True
a = ‘aaaadsa’
b = ‘awaae’
s = ‘aaawaasdaaae’
return False
少说废话, 先上代码(Python)
def abs (a,b,s):
if len(a) + len(b) != len(s):
return False
f, j, i = 0,0,0
while f < len(a) and j < len(b) and i < len(s):
if s[i] != a[f] and s[i] != b[j]:
print(7,'\n','a:',a[:f],a[f:],'\n','b:',b[:j],b[j:],'\n','s:',s[:i],s[i:])
return False
elif s[i] == a[f] and s[i] != b[j]:
f += 1
elif s[i] != a[f] and s[i] == b[j]:
j += 1
else:
try:
if len(a)-f < len(b)-j:
m = len(a) - f
if m == 1:
j += 1
else:
m = len(b) - j
if m == 1:
f += 1
if s[i+1] != b[j+1] and s[i+1] != a[f+1] and s[i+1] != s[i]:
print(24,'\n','a:',a[:f],a[f:],'\n','b:',b[:j],b[j:],'\n','s:',s[:i],s[i:])
return False
for n in range(1, m):
if s[i+n] != b[j+n] and s[i+n] == a[f+n]:
f += 1
break
elif s[i+n] == b[j+n] and s[i+n] != a[f+n]:
j += 1
break
else:
print('都相等或都不等, n+1',f,j,i,n,m)
if n == m-1:
if len(a) - f < len(b) - j:
j += 1
else:
f += 1
except:
print('最后一位,超出索引',f,j,i)
i += 1
print(43, '\n', 'a:', a[:f], a[f:], '\n', 'b:', b[:j], b[j:], '\n', 's:', s[:i], s[i:])
if a[f:]+b[j:]!=s[i:]:
print(46,'\n','a:',a[:f],a[f:],'\n','b:',b[:j],b[j:],'\n','s:',s[:i],s[i:])
return False
return True
if __name__ == '__main__':
a = 'aaaasda'
b = 'awaae'
s = 'aaawaasdaaae'
# a,b,s = 'aaaa', 'aabaa', 'aaaaabaaa'
jieguo = abs(a,b,s)
print(jieguo)
思路如下:
一. 判断s长度 等于 a+b 的长度, (这里不用判断一个为空的情况, 在最后45行有判断)
二. 分别赋予a,b,s一个指针(索引) f, j, i, 是指针向后跳
三. 如果 i 不对应f也不对应j, 结束,返回False
四. 如果 i 对应f或j其中一个,该指针+1,i+1
五. 如果 i 对应f和j, 则向后一位比对
1.若s后一位不等s[i] , a后一位, b,后一位, 返回False
2.取a,b剩余较短的循环次数, (若只剩一位,优先跳长的指针)
3.有只符合a,b其中一个的, 该指针跳一位,
4. 两个都相等或都不等, 继续后向后比
5. 循环至最后一遍仍一样, 则较长的跳一位
六.a,b一个跳完, 对比和s的结尾,不同则False
七.以上都走完, 恭喜, S是a和b不变顺序混合而成的