鱼C论坛

 找回密码
 立即注册
查看: 5658|回复: 54

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

[复制链接]
发表于 2020-2-13 17:50:50 | 显示全部楼层 |阅读模式

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

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

x
今天的题目:


给定一个只包含大写字母 A 和 B 的字符串。删除最少的字符使得字符串变成 A...AB...B 的形式。

返回需要删除的最少字符数。

示例 1:

输入:"BAAABAB"
输出:2
解释:删除第一个 B 和最后一个 A,构成 "AAABB"。
示例 2:

输入:"BBABAA"
输出:3
解释:可以删除所有的 A 或 B。
示例 3:

输入:"AABBBB"
输出:0
解释:不需要删除任何字符,因为字符串本身符合条件。


欢迎大家一起答题!
最佳答案
2020-2-13 20:29:53
本帖最后由 wanting-for 于 2020-2-13 23:28 编辑
  1. def solve_311(s: str):
  2.     a_c, b_c, len_s, count = s.count('A'), s.count('B'), len(s), float('inf')
  3.     a_cc, b_cc, i = 0, 0, 0
  4.     i = 0
  5.     while i < len_s - 1:
  6.         if s[i] == 'A' and s[i+1] == 'B':
  7.             now = a_c - a_cc - 1
  8.             if now + b_cc < count:
  9.                 count = now + b_cc
  10.             i += 2
  11.             a_cc += 1
  12.             b_cc += 1
  13.         elif s[i] == 'B':
  14.             b_cc += 1
  15.             i += 1
  16.         elif s[i] == 'A':
  17.             a_cc += 1
  18.             i += 1
  19.     return min(a_c,b_c,count)
  20. print(solve_311("AABBBB"))
复制代码

看似简便,就是不知道效率怎们样,
这道题感觉方法还是比较明确的

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
蒋博文 + 1 + 1 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-13 18:08:57 | 显示全部楼层
也就是 AAA 或 BBB也算?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:09:27 | 显示全部楼层
  1. def f331(x):
  2.     m,sa,sb,ta=len(x),0,0,x.count('A')
  3.     for e in x:
  4.         if e=='A':
  5.             sa+=1
  6.         if e=='B':
  7.             sb+=1
  8.         m=min(sb+ta-sa,m)
  9.     return m
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:10:34 | 显示全部楼层
zltzlt 发表于 2020-2-13 18:09
不算,而且字符串一定既包含 A 也包含 B

BBABAA 为什么是3? 最少4个吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2020-2-13 18:10:44 | 显示全部楼层

解答错误

输入:
  1. "BBABABBBABABABBBABABABAABBBBABAABBBBABABBBBABBAABBBABBBBABBABAAABBBABAABAAAAAABABAABABBAABBBABBABAAAAAABBBBAAAAAAABBBBAABAABAABABABAABBAAABBAABBBBABBBBAAAABABBBBBBABBBBBAABAAAAAABABABBAABBABBABAABABABABABABBAAABBBBBBBBABBABABBABBBBBBBABBBBAABBBAABBAABBABAAABABBAAAAAAAABBAAABAAABBAAABBABBBAAABBBBBABABBABBBBBABBBBBAAAAAABBAABABAAABABBAAAABBBBBAAAAAABBAAABAABAABBABBBBAABABBAABAAAAAAAAABAABBBBABBBBBAABABABBBABBAABBBAAAABABABBBABAABBBBABAABABAAABBABBBBBABBBBBABBBAABABBAABBBBAABABAABBBAABABBBAAAABAAAABBBAAABAABAABAAAAAAABBBABABBBBABBABBBBABAABABBABABBBABBABBAAAABAABBBBABAABABBBABBBAABBBBBBBBBABAAAABAAAAAABABAABAABBAABAAAAAABBBBBBAABBBBBAAAAAAAABBAAAABAAABBAABAABAABAAAABAAAAABABBAABAABAABAAAABABABABBAABBBAABAAABBABABAAABBBBBABBBAABBBABBBABBBABABBBBBAAAABAABBBBBAABABBAABBABBABBBABBBABBBBABAABBAAAAABBAAAABABBABBBBBAABBBBBAABBBBBABBBABBBBABABAAABBABABAAAAAABABAABBABBABABAABBBBABABBAAAABBBABABBBBABBBAAABAAAAABAAABBABBBBAAAABBBBABBBBBBAABABBBBAABBABAABBAABBBABAAAABABBBAAAABAABABBABBBBBAABBBBABBBAA"
复制代码

输出:476
预期结果:475
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-13 18:12:01 | 显示全部楼层
TJBEST 发表于 2020-2-13 18:10
BBABAA 为什么是3? 最少4个吧?

自相矛盾了……

刚刚说错了,AAA 或 BBB 也算
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:15:17 | 显示全部楼层
zltzlt 发表于 2020-2-13 18:12
自相矛盾了……

刚刚说错了,AAA 或 BBB 也算

好的 也就是 只剩A或者只剩B也算 对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-13 18:15:33 | 显示全部楼层
TJBEST 发表于 2020-2-13 18:15
好的 也就是 只剩A或者只剩B也算 对吧

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:29:15 | 显示全部楼层
本帖最后由 塔利班 于 2020-2-13 18:37 编辑
zltzlt 发表于 2020-2-13 18:10
解答错误

输入:

  1. def f331(x):
  2.     m,sa,sb,ta=len(x),0,0,x.count('A')
  3.     for e in 'C'+x:
  4.         if e=='A':
  5.             sa+=1
  6.         elif e=='B':
  7.             sb+=1
  8.         m=min(sb+ta-sa,m)
  9.     return m
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-13 18:43:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:53:13 | 显示全部楼层
塔利班的方法真的妙,我的方法真的相形见绌了,不过不能抄袭
  1. def fun331(string):
  2.     M = len(string)
  3.     try:
  4.         firstCharcter = string[0]
  5.     except Exception:
  6.         return 0
  7.     A_List = []
  8.     B_List = []
  9.    
  10.     temp = firstCharcter
  11.     count = 1
  12.     for i in range(1,M):
  13.         if string[i] == temp:
  14.             count += 1
  15.         else:
  16.             if temp == 'A':
  17.                 A_List.append(count)
  18.             else:
  19.                 B_List.append(count)
  20.             temp = string[i]
  21.             count = 1
  22.     if temp == 'A':
  23.         A_List.append(count)
  24.     else:
  25.         B_List.append(count)
  26.    
  27.     possible = []
  28.     possible.append(min(sum(A_List),sum(B_List)))
  29.    
  30.    
  31.     if len(A_List) > len(B_List):
  32.         constRes = A_List.pop()
  33.     elif len(A_List) < len(B_List):
  34.         constRes = B_List[0]
  35.         B_List = B_List[1:]
  36.     else:
  37.         if firstCharcter == 'A':
  38.             constRes = 0
  39.         else:
  40.             constRes = A_List.pop() + B_List[0]
  41.             B_List = B_List[1:]
  42.    
  43.     index = 0
  44.     while index < len(A_List):
  45.         possible.append(constRes + sum(B_List[0:index])+sum(A_List[(index + 1):]))
  46.         index += 1
  47.     return min(possible)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-13 18:53:52 | 显示全部楼层
TJBEST 发表于 2020-2-13 18:53
塔利班的方法真的妙,我的方法真的相形见绌了,不过不能抄袭

超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 20:17:15 | 显示全部楼层
还超时吗?
  1. def fun331(string):
  2.     M = len(string)
  3.     try:
  4.         firstCharcter = string[0]
  5.     except Exception:
  6.         return 0
  7.    
  8.     A_has = string.count('A')
  9.     B_has = M - A_has
  10.    
  11.     result = min([A_has,B_has])
  12.    
  13.     for i in range(0,M - 1):
  14.         if string[i] == 'A' and string[i+1] == 'B':
  15.             result = min([result,string[0:i].count('B')+string[(i+1):].count('A')])
  16.     return result
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 20:29:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wanting-for 于 2020-2-13 23:28 编辑
  1. def solve_311(s: str):
  2.     a_c, b_c, len_s, count = s.count('A'), s.count('B'), len(s), float('inf')
  3.     a_cc, b_cc, i = 0, 0, 0
  4.     i = 0
  5.     while i < len_s - 1:
  6.         if s[i] == 'A' and s[i+1] == 'B':
  7.             now = a_c - a_cc - 1
  8.             if now + b_cc < count:
  9.                 count = now + b_cc
  10.             i += 2
  11.             a_cc += 1
  12.             b_cc += 1
  13.         elif s[i] == 'B':
  14.             b_cc += 1
  15.             i += 1
  16.         elif s[i] == 'A':
  17.             a_cc += 1
  18.             i += 1
  19.     return min(a_c,b_c,count)
  20. print(solve_311("AABBBB"))
复制代码

看似简便,就是不知道效率怎们样,
这道题感觉方法还是比较明确的

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 20:49:27 | 显示全部楼层
  1. def f331(x):
  2.     m,sa,sb=len(x),0,0
  3.     for e in 'C'+x:
  4.         if e=='A':
  5.             sa+=1
  6.         elif e=='B':
  7.             sb+=1
  8.         m=min(sb-sa,m)
  9.     return m+sa
复制代码

想了想count本来就死On,多跑了一圈

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 21:23:36 | 显示全部楼层
不晓得有没有错漏。
  1. def solve(s:str)->int:
  2.     s1 = list(s)
  3.     temp = sorted(s)
  4.     res = 0
  5.     while s1 != temp:
  6.         for i in range(len(s1)):
  7.             if s1[i] != temp[i]:
  8.                 res += 1
  9.                 if s1[i] == 'A':
  10.                     temp.pop(0)
  11.                 else:
  12.                     temp.pop(-1)
  13.                 s1.pop(i)
  14.                 break
  15.     if len(set(s1)) == 1:
  16.         res = min(s.count('A'),res)
  17.     return res
  18. if __name__ == '__main__':
  19.     print('示例1 输出:',solve('BAAABAB'))
  20.     print('示例2 输出:',solve('BBABBAA'))
  21.     print('示例3 输出:',solve('AABBBB'))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 21:38:33 | 显示全部楼层
本帖最后由 genius_7321 于 2020-2-13 23:10 编辑

我的方法好像有点笨:

  1. import re


  2. def my_answer(s, tar='AB'):
  3.     flag = 0
  4.     aabb = 0
  5.     dist = {}
  6.     if s.count('A') == 0 or s.count('B') == 0:
  7.         return f'共需删除0个字符!\n字符串本身符合条件'
  8.     else:
  9.         for each in re.finditer(tar, s):
  10.             if s.count('A') == s.count('B'):
  11.                 aabb = s.count('B')
  12.                 flag = 1
  13.             else:
  14.                 sum = s.count('A', each.start() + 1, len(s)) + s.count('B', 0, each.start())
  15.                 if sum == 0:
  16.                     flag = 2
  17.                 else:
  18.                     dist[each.start()] = sum
  19.         if flag == 0:
  20.             min_index = min(dist, key=lambda k: dist[k])
  21.             if dist[min_index] > s.count('A'):
  22.                 a = s.count('A')
  23.                 sb = s.replace('A', '')
  24.                 return f'共需删除{a}个字符!\n新字符串为{sb}'
  25.             elif dist[min_index] > s.count('B'):
  26.                 a = s.count('B')
  27.                 sa = s.replace('B', '')
  28.                 return f'共需删除{a}个字符!\n新字符串为{sa}'
  29.             else:
  30.                 sa = s[:min_index + 1].replace('B', '')
  31.                 sb = s[min_index + 1:].replace('A', '')
  32.                 return f'共需删除{dist[min_index]}个字符!\n新字符串为{sa + sb}'
  33.         elif flag == 1:
  34.             return f'共需删除{aabb}个字符!\n可以删除所有的 A 或 B'
  35.         else:
  36.             return f'共需删除0个字符!\n字符串本身符合条件'


  37. print('示例1结果:', my_answer('BAAABAB'))
  38. print('示例2结果:', my_answer('BBABAA'))
  39. print('示例3结果:', my_answer('AABBBB'))
复制代码


评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 21:50:18 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-2-13 21:51 编辑

def f331(s:str)->int:
    res,tA,a,b,=min(s.count('A'),s.count('B')),s.count('A'),0,0
    for i in s:
        if i=='A':
            a+=1
        if i=='B':
            b+=1
        res=min(b+tA-a,res)
    return res
L=['BAAABAB','BBABAA','AABBBB']
for s in L:
    print(f331(s))

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 22:22:51 | 显示全部楼层
  1. def fun331(s):
  2.     flag = 'A'
  3.     c = 0
  4.     c_A = s.count('A')
  5.     c_B = s.count('B')
  6.     t = 0
  7.     if (c_A == len(s)) or (c_B == len(s)):
  8.         return 0
  9.     for i in s:
  10.         if i != flag:
  11.             c += 1
  12.             if t>0:
  13.                 flag = 'B'
  14.         else:
  15.             t += 1
  16.     return min(c-1,c_A,c_B)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 23:15:44 | 显示全部楼层
zltzlt 发表于 2020-2-13 18:10
解答错误

输入:

这个删除前面两个B最后两个A,不就是A开头,B结束,中间有AB的字符串了吗?A...AB...B到底是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 08:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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