判断字符串S是否是字符串A和字符串B混合而成(a,b中元素顺序不变)

判断字符串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 对应fj其中一个,该指针+1,i+1
五. 如果 i 对应fj, 则向后一位比对

		1.若s后一位不等s[i] , a后一位, b,后一位, 返回False
		2.取a,b剩余较短的循环次数, (若只剩一位,优先跳长的指针)
		3.有只符合a,b其中一个的, 该指针跳一位,
		4. 两个都相等或都不等, 继续后向后比
		5. 循环至最后一遍仍一样, 则较长的跳一位

六.a,b一个跳完, 对比和s的结尾,不同则False
七.以上都走完, 恭喜, S是a和b不变顺序混合而成的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值