鱼C论坛

 找回密码
 立即注册
查看: 2272|回复: 37

[已解决]Python:每日一题 267

[复制链接]
发表于 2019-11-2 08:13:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-11-2 09:10 编辑

今天的题目:


给出三个字符串:s1、s2、s3,判断 s3 是否由 s1 和 s2 交叉构成

示例 1:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:True
示例 2:

输入:s1 = "", s2 = "", s3 = "1"
输出:False
示例 3:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:False


欢迎大家一起答题!
最佳答案
2019-11-2 09:05:38
  1. def dp(s1,s2,s3):
  2.     if not (s1 and s2 and s3):
  3.         return s3==s1+s2
  4.     else:
  5.         if s3[0]==s1[0] and s3[0]==s2[0]:
  6.             return dp(s1[1:],s2,s3[1:])or dp(s1,s2[1:],s3[1:])
  7.         elif s3[0]==s1[0]:
  8.             return dp(s1[1:],s2,s3[1:])
  9.         elif s3[0]==s2[0]:
  10.             return dp(s1,s2[1:],s3[1:])
  11.         else:
  12.             return False
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-2 09:05:38 | 显示全部楼层    本楼为最佳答案   
  1. def dp(s1,s2,s3):
  2.     if not (s1 and s2 and s3):
  3.         return s3==s1+s2
  4.     else:
  5.         if s3[0]==s1[0] and s3[0]==s2[0]:
  6.             return dp(s1[1:],s2,s3[1:])or dp(s1,s2[1:],s3[1:])
  7.         elif s3[0]==s1[0]:
  8.             return dp(s1[1:],s2,s3[1:])
  9.         elif s3[0]==s2[0]:
  10.             return dp(s1,s2[1:],s3[1:])
  11.         else:
  12.             return False
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-11-2 09:11:47 | 显示全部楼层

恭喜通过!

执行用时:101 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 11:23:24 | 显示全部楼层
def s1_s2(s1,s2,s3):
    new_s = s1 + s2
    for s in new_s:
        if s in s3:
            new_s3 = s3.replace(s,'',1)
            s3 = new_s3
        else:
            return False
    if new_s3 == '':
        return True
    else:
        return False

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 12:05:11 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-11-2 12:14 编辑

搞定咯!
我刚才在搞什么哦!
  1. def solve(s1:str,s2:str,s3:str)->bool:
  2.     if len(s3) != len(s1+s2):
  3.         print('调试',1)
  4.         return False
  5.     a=set(s1+s2)
  6.     for i in a:
  7.         if s1.count(i) + s2.count(i) != s3.count(i):
  8.             print('调试',2)
  9.             return False
  10.     s1,s2,s3 = list(s1),list(s2),list(s3)
  11.     begin = True
  12.     changed = False
  13.     while s1 and s2:
  14.         if s3[0] == s1[0]:
  15.             if begin:
  16.                 begin = False
  17.                 flg = 1
  18.             elif flg == 2:
  19.                 changed = True
  20.             s1.pop(0)
  21.         elif s3[0] == s2[0]:
  22.             if begin:
  23.                 begin = False
  24.                 flg = 2
  25.             elif flg == 1:
  26.                 changed = True
  27.             s2.pop(0)
  28.         else:
  29.             print('调试',3)
  30.             return False
  31.         s3.pop(0)
  32.     else:
  33.         print('调试',4)
  34.         return changed

  35. if __name__ == '__main__':
  36.     print('示例1 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"))
  37.     print('示例2 输出:',solve(s1 = "", s2 = "", s3 = "1"))
  38.     print('示例3 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"))

复制代码


二楼那个,不考虑最大递归深度吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 12:31:00 | 显示全部楼层
122815306 发表于 2019-11-2 11:23
def s1_s2(s1,s2,s3):
    new_s = s1 + s2
    for s in new_s:

输入 s1 = '', s2 = '', s3 = '' 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 12:32:37 | 显示全部楼层
阴阳神万物主 发表于 2019-11-2 12:05
搞定咯!
我刚才在搞什么哦!

解答错误

输入:s1 = "", s2 = "", s3 = ""
打印:调试 4
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 12:44:13 | 显示全部楼层
zltzlt 发表于 2019-11-2 12:32
解答错误

输入:s1 = "", s2 = "", s3 = ""

哦,原来全为空认定为交叉啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 12:52:31 | 显示全部楼层
zltzlt 发表于 2019-11-2 12:32
解答错误

输入:s1 = "", s2 = "", s3 = ""

加上特殊处理,完事儿
  1. def solve(s1:str,s2:str,s3:str)->bool:
  2.     if len(s3) != len(s1+s2):
  3.         #print('调试',1)
  4.         return False
  5.     elif not(len(s1)and len(s2)and len(s3)):
  6.         #print('调试',5)
  7.         return True
  8.     a=set(s1+s2)
  9.     for i in a:
  10.         if s1.count(i) + s2.count(i) != s3.count(i):
  11.             #print('调试',2)
  12.             return False
  13.     s1,s2,s3 = list(s1),list(s2),list(s3)
  14.     begin = True
  15.     changed = False
  16.     while s1 and s2:
  17.         if s3[0] == s1[0]:
  18.             if begin:
  19.                 begin = False
  20.                 flg = 1
  21.             elif flg == 2:
  22.                 changed = True
  23.             s1.pop(0)
  24.         elif s3[0] == s2[0]:
  25.             if begin:
  26.                 begin = False
  27.                 flg = 2
  28.             elif flg == 1:
  29.                 changed = True
  30.             s2.pop(0)
  31.         else:
  32.             #print('调试',3)
  33.             return False
  34.         s3.pop(0)
  35.     else:
  36.         #print('调试',4)
  37.         return changed

  38. if __name__ == '__main__':
  39.     print('示例1 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"))
  40.     print('示例2 输出:',solve(s1 = "", s2 = "", s3 = "1"))
  41.     print('示例3 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 12:55:15 | 显示全部楼层
阴阳神万物主 发表于 2019-11-2 12:52
加上特殊处理,完事儿

输入:s1 = "aa", s2 = "a", s3 = "aaa"
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 13:21:55 | 显示全部楼层
zltzlt 发表于 2019-11-2 12:55
输入:s1 = "aa", s2 = "a", s3 = "aaa"
输出:False
预期结果:True

这回,也许、大概没问题了
  1. def solve(s1:str,s2:str,s3:str)->bool:
  2.     if len(s3) != len(s1+s2):
  3.         print('调试',1)
  4.         return False
  5.     elif not(len(s1)and len(s2)and len(s3)):
  6.         print('调试',5)
  7.         return True
  8.     a=set(s1+s2)
  9.     for i in a:
  10.         if s1.count(i) + s2.count(i) != s3.count(i):
  11.             print('调试',2)
  12.             return False
  13.     s1,s2,s3 = list(s1),list(s2),list(s3)
  14.     begin = True
  15.     changed = False
  16.     while s1 and s2:
  17.         if begin:
  18.             if s3[0] == s1[0]:
  19.                 begin = False
  20.                 flg = 1
  21.                 s1.pop(0)
  22.             elif s3[0] == s2[0]:
  23.                 begin = False
  24.                 flg = 2
  25.                 s2.pop(0)
  26.         else:
  27.             if flg == 1:
  28.                 if s3[0] == s2[0]:
  29.                     s2.pop(0)
  30.                     changed = True
  31.                 elif s3[0] == s1[0]:
  32.                     s1.pop(0)
  33.                 else:
  34.                     print('调试',3)
  35.                     return False
  36.             elif flg == 2:
  37.                 if s3[0] == s1[0]:
  38.                     s1.pop(0)
  39.                     changed = True
  40.                 elif s3[0] == s2[0]:
  41.                     s2.pop(0)
  42.                 else:
  43.                     print('调试',3)
  44.                     return False
  45.         s3.pop(0)
  46.     else:
  47.         print('调试',4)
  48.         return changed

  49. if __name__ == '__main__':
  50.     print('示例1 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"))
  51.     print('示例2 输出:',solve(s1 = "", s2 = "", s3 = "1"))
  52.     print('示例3 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"))
  53.     print('之前错的',solve(s1 = "aa", s2 = "a", s3 = "aaa"))
复制代码

我之前在网上算了一挂,结果……
§ 大凶 §
诸事不宜
忌:玩网游
匹配到一群猪队友
忌:参加模拟赛
注意爆零
我之前还不信呢……现在……哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 13:24:32 | 显示全部楼层
阴阳神万物主 发表于 2019-11-2 13:21
这回,也许、大概没问题了
我之前在网上算了一挂,结果……
§ 大凶 §

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 13:25:17 | 显示全部楼层
阴阳神万物主 发表于 2019-11-2 13:21
这回,也许、大概没问题了
我之前在网上算了一挂,结果……
§ 大凶 §

解答错误

输入:s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"
打印:调试 4
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 14:47:38 | 显示全部楼层
zltzlt 发表于 2019-11-2 12:31
输入 s1 = '', s2 = '', s3 = '' 出错

啊 应该在最前面加上这两行
    if not (s1 and s2 and s3):
        return s3==s1+s2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 16:04:18 | 显示全部楼层
  1. course1 = 0
  2. course2 = 0
  3. course3 = 0

  4. def str1check(s1,s3):
  5.     global course1,course2,course3
  6.     while course3 < len(s3) and course1 < len(s1):
  7.         if s1[course1] == s3[course3]:
  8.             course1 += 1
  9.             course3 += 1
  10.         else:
  11.             break

  12. def str2check(s2,s3):
  13.     global course1,course2,course3
  14.     while course3 < len(s3) and course2 < len(s2):
  15.         if s2[course2] == s3[course3]:
  16.             course2 += 1
  17.             course3 += 1
  18.         else:
  19.             break
  20.    
  21. def func(s1,s2,s3):
  22.     global course1,course2,course3
  23.     while course3 != len(s3):
  24.         temp = course3
  25.         str1check(s1,s3)
  26.         str2check(s2,s3)
  27.         if temp == course3:
  28.             return False
  29.     if course1 == len(s1) and course2 == len(s2):
  30.         return True
  31.     else:
  32.         return False
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 17:07:39 | 显示全部楼层
zltzlt 发表于 2019-11-2 13:25
解答错误

输入:s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"

兴许好使了
  1. def differ(a:list,b:list):
  2.     for i in range(min((len(a),len(b)))):
  3.         if a[i] != b[i]:
  4.             return i
  5.     return min((len(a),len(b)))
  6. def solve(s1:str,s2:str,s3:str)->bool:
  7.     if len(s3) != len(s1+s2):
  8.         #print('调试',1)
  9.         return False
  10.     elif not(len(s1)and len(s2)and len(s3)):
  11.         #print('调试',5)
  12.         return True
  13.     a=set(s1+s2)
  14.     for i in a:
  15.         if s1.count(i) + s2.count(i) != s3.count(i):
  16.             #print('调试',2)
  17.             return False
  18.     s1,s2,s3 = list(s1),list(s2),list(s3)
  19.     begin = True
  20.     num = differ(s1,s3)
  21.     num1 = differ(s2,s3)
  22.     if num > num1:
  23.         flg = 2
  24.     else:
  25.         flg = 1
  26.     while s1 and s2:
  27.         if begin:
  28.             begin = False
  29.             if flg == 2:
  30.                 #print('调试',s1[:num1],s2[:num1],s3[:num1])
  31.                 s1 = s1[num1:]
  32.                 s3 = s3[num1:]
  33.             elif flg == 1:
  34.                 #print('调试',s1[:num],s2[:num],s3[:num])
  35.                 s2 = s2[num:]
  36.                 s3 = s3[num:]
  37.             #print('调试',s1,s2,s3)
  38.             changed = False
  39.             continue
  40.         else:
  41.             if flg == 1:
  42.                 if s3[0] == s2[0]:
  43.                     s2.pop(0)
  44.                     changed = True
  45.                     flg = 2
  46.                 elif s3[0] == s1[0]:
  47.                     s1.pop(0)
  48.                 else:
  49.                     #print('调试',3)
  50.                     return False
  51.             elif flg == 2:
  52.                 if s3[0] == s1[0]:
  53.                     s1.pop(0)
  54.                     changed = True
  55.                     flg = 1
  56.                 elif s3[0] == s2[0]:
  57.                     s2.pop(0)
  58.                 else:
  59.                     #print('调试',3)
  60.                     return False
  61.         s3.pop(0)
  62.     else:
  63.         #print('调试',4)
  64.         return changed

  65. if __name__ == '__main__':
  66.     print('示例1 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"))
  67.     print('示例2 输出:',solve(s1 = "", s2 = "", s3 = "1"))
  68.     print('示例3 输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"))
  69.     print('之前错的',solve(s1='aa',s2='a',s3='aaa'))
  70.     print('之前错的',solve(s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 17:59:20 | 显示全部楼层

解答错误

输入:s1 = "aba", s2 = "a", s3 = "aaba"
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 18:55:59 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-11-2 18:57 编辑
zltzlt 发表于 2019-11-2 13:25
解答错误

输入:s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"

嗯?这也算交叉?
s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"
这……拼接也算交叉啊?
我以为,至少这样算交叉呢:s3 = "abbcddeafccbbbcd"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 19:11:28 | 显示全部楼层
zltzlt 发表于 2019-11-2 17:59
解答错误

输入:s1 = "aba", s2 = "a", s3 = "aaba"


我这回又改了改,应该好使了:
  1. def differ(a:list,b:list):
  2.     for i in range(min((len(a),len(b)))):
  3.         if a[i] != b[i]:
  4.             return i
  5.     return min((len(a),len(b)))
  6. def solve(s1:str,s2:str,s3:str)->bool:
  7.     if len(s3) != len(s1+s2):
  8.         print('调试',1,'长度不对')
  9.         return False
  10.     elif (s3 == s1+s2)or(s3==s2+s1):
  11.         print('调试',2,'算拼接')
  12.         return True
  13.     a=set(s1+s2)
  14.     for i in a:
  15.         if s1.count(i) + s2.count(i) != s3.count(i):
  16.             print('调试',3,'数儿不对')
  17.             return False
  18.     s1,s2,s3 = list(s1),list(s2),list(s3)
  19.     if s1[0] == s2[0]:
  20.         num = differ(s1,s3)
  21.         num1 = differ(s2,s3)
  22.         if num == num1:
  23.             if len(s1) >= len(s2):
  24.                 flg = 1
  25.             else:
  26.                 flg = 2
  27.         elif num > num1:
  28.             flg = 1
  29.         else:
  30.             flg = 2
  31.     elif s1[0] == s3[0]:
  32.         flg = 1
  33.     elif s2[0] == s3[0]:
  34.         flg = 2
  35.     if flg == 1:
  36.         s1.pop(0)
  37.     elif flg == 2:
  38.         s2.pop(0)
  39.     s3.pop(0)
  40.     #print('调试',s1,s2,s3)
  41.     changed = False
  42.     while s1 or s2:
  43.         if s1 == []:
  44.             if s2[0] == s3[0]:
  45.                 s2.pop(0)
  46.             else:
  47.                 print('调试',4,'顺序不对')
  48.                 return False
  49.         elif s2 == []:
  50.             if s1[0] == s3[0]:
  51.                 s1.pop(0)
  52.             else:
  53.                 print('调试',4,'顺序不对')
  54.                 return False
  55.         elif flg == 1:
  56.             if s2[0] == s3[0]:
  57.                 s2.pop(0)
  58.                 if not changed:
  59.                     changed = True
  60.             elif s1[0] == s3[0]:
  61.                 s1.pop(0)
  62.             else:
  63.                 print('调试',4,'顺序不对')
  64.                 return False
  65.         elif flg == 2:
  66.             if s1[0] == s3[0]:
  67.                 s1.pop(0)
  68.                 if not changed:
  69.                     changed = True
  70.             elif s2[0] == s3[0]:
  71.                 s2.pop(0)
  72.             else:
  73.                 print('调试',4,'顺序不对')
  74.                 return False
  75.         s3.pop(0)
  76.     else:
  77.         print('调试',5,'循环结束,能走到这儿,大概率是对的,但咱不赌')
  78.         return changed

  79. if __name__ == '__main__':
  80.     print('示例1 T输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"))
  81.     print('示例2 F输出:',solve(s1 = "", s2 = "", s3 = "1"))
  82.     print('示例3 F输出:',solve(s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"))
  83.     print('之前错的T',solve(s1='aa',s2='a',s3='aaa'))
  84.     print('之前错的T',solve(s1 = "abbcddef", s2 = "accbbbcd", s3 = "abbcddefaccbbbcd"))
  85.     print('之前错的T',solve(s1 = "aba", s2 = "a", s3 = "aaba"))
复制代码

这回,要是再不对,我就……


这回要是再不好使,我就……


我就……


我就吃饭去!(嗯?你以为呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 19:19:35 | 显示全部楼层
阴阳神万物主 发表于 2019-11-2 19:11
我这回又改了改,应该好使了:

这回,要是再不对,我就……

还没吃饭吶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 08:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表