鱼C论坛

 找回密码
 立即注册
查看: 4303|回复: 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 编辑
def solve_311(s: str):
    a_c, b_c, len_s, count = s.count('A'), s.count('B'), len(s), float('inf')
    a_cc, b_cc, i = 0, 0, 0
    i = 0
    while i < len_s - 1:
        if s[i] == 'A' and s[i+1] == 'B':
            now = a_c - a_cc - 1
            if now + b_cc < count:
                count = now + b_cc
            i += 2
            a_cc += 1
            b_cc += 1
        elif s[i] == 'B':
            b_cc += 1
            i += 1
        elif s[i] == 'A':
            a_cc += 1
            i += 1
    return min(a_c,b_c,count)
print(solve_311("AABBBB"))
看似简便,就是不知道效率怎们样,
这道题感觉方法还是比较明确的

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-2-13 18:08:57 | 显示全部楼层
也就是 AAA 或 BBB也算?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

BBABAA 为什么是3? 最少4个吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

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

解答错误

输入:
"BBABABBBABABABBBABABABAABBBBABAABBBBABABBBBABBAABBBABBBBABBABAAABBBABAABAAAAAABABAABABBAABBBABBABAAAAAABBBBAAAAAAABBBBAABAABAABABABAABBAAABBAABBBBABBBBAAAABABBBBBBABBBBBAABAAAAAABABABBAABBABBABAABABABABABABBAAABBBBBBBBABBABABBABBBBBBBABBBBAABBBAABBAABBABAAABABBAAAAAAAABBAAABAAABBAAABBABBBAAABBBBBABABBABBBBBABBBBBAAAAAABBAABABAAABABBAAAABBBBBAAAAAABBAAABAABAABBABBBBAABABBAABAAAAAAAAABAABBBBABBBBBAABABABBBABBAABBBAAAABABABBBABAABBBBABAABABAAABBABBBBBABBBBBABBBAABABBAABBBBAABABAABBBAABABBBAAAABAAAABBBAAABAABAABAAAAAAABBBABABBBBABBABBBBABAABABBABABBBABBABBAAAABAABBBBABAABABBBABBBAABBBBBBBBBABAAAABAAAAAABABAABAABBAABAAAAAABBBBBBAABBBBBAAAAAAAABBAAAABAAABBAABAABAABAAAABAAAAABABBAABAABAABAAAABABABABBAABBBAABAAABBABABAAABBBBBABBBAABBBABBBABBBABABBBBBAAAABAABBBBBAABABBAABBABBABBBABBBABBBBABAABBAAAAABBAAAABABBABBBBBAABBBBBAABBBBBABBBABBBBABABAAABBABABAAAAAABABAABBABBABABAABBBBABABBAAAABBBABABBBBABBBAAABAAAAABAAABBABBBBAAAABBBBABBBBBBAABABBBBAABBABAABBAABBBABAAAABABBBAAAABAABABBABBBBBAABBBBABBBAA"
输出:476
预期结果:475
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

自相矛盾了……

刚刚说错了,AAA 或 BBB 也算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

刚刚说错了,AAA 或 BBB 也算

好的 也就是 只剩A或者只剩B也算 对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

输入:

def f331(x):
    m,sa,sb,ta=len(x),0,0,x.count('A')
    for e in 'C'+x:
        if e=='A':
            sa+=1
        elif e=='B':
            sb+=1
        m=min(sb+ta-sa,m)
    return m

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-13 18:43:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 18:53:13 | 显示全部楼层
塔利班的方法真的妙,我的方法真的相形见绌了,不过不能抄袭
def fun331(string):
    M = len(string)
    try:
        firstCharcter = string[0]
    except Exception:
        return 0
    A_List = []
    B_List = []
   
    temp = firstCharcter
    count = 1
    for i in range(1,M):
        if string[i] == temp:
            count += 1
        else:
            if temp == 'A':
                A_List.append(count)
            else:
                B_List.append(count)
            temp = string[i]
            count = 1
    if temp == 'A':
        A_List.append(count)
    else:
        B_List.append(count)
    
    possible = []
    possible.append(min(sum(A_List),sum(B_List)))
    
    
    if len(A_List) > len(B_List):
        constRes = A_List.pop()
    elif len(A_List) < len(B_List):
        constRes = B_List[0]
        B_List = B_List[1:]
    else:
        if firstCharcter == 'A':
            constRes = 0
        else:
            constRes = A_List.pop() + B_List[0]
            B_List = B_List[1:]
    
    index = 0
    while index < len(A_List):
        possible.append(constRes + sum(B_List[0:index])+sum(A_List[(index + 1):]))
        index += 1
    return min(possible)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-2-13 20:17:15 | 显示全部楼层
还超时吗?
def fun331(string):
    M = len(string)
    try:
        firstCharcter = string[0]
    except Exception:
        return 0
    
    A_has = string.count('A')
    B_has = M - A_has
    
    result = min([A_has,B_has])
    
    for i in range(0,M - 1):
        if string[i] == 'A' and string[i+1] == 'B':
            result = min([result,string[0:i].count('B')+string[(i+1):].count('A')])
    return result
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 20:29:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wanting-for 于 2020-2-13 23:28 编辑
def solve_311(s: str):
    a_c, b_c, len_s, count = s.count('A'), s.count('B'), len(s), float('inf')
    a_cc, b_cc, i = 0, 0, 0
    i = 0
    while i < len_s - 1:
        if s[i] == 'A' and s[i+1] == 'B':
            now = a_c - a_cc - 1
            if now + b_cc < count:
                count = now + b_cc
            i += 2
            a_cc += 1
            b_cc += 1
        elif s[i] == 'B':
            b_cc += 1
            i += 1
        elif s[i] == 'A':
            a_cc += 1
            i += 1
    return min(a_c,b_c,count)
print(solve_311("AABBBB"))
看似简便,就是不知道效率怎们样,
这道题感觉方法还是比较明确的

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-2-13 20:49:27 | 显示全部楼层
def f331(x):
    m,sa,sb=len(x),0,0
    for e in 'C'+x:
        if e=='A':
            sa+=1
        elif e=='B':
            sb+=1
        m=min(sb-sa,m)
    return m+sa
想了想count本来就死On,多跑了一圈

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-2-13 21:23:36 | 显示全部楼层
不晓得有没有错漏。
def solve(s:str)->int:
    s1 = list(s)
    temp = sorted(s)
    res = 0
    while s1 != temp:
        for i in range(len(s1)):
            if s1[i] != temp[i]:
                res += 1
                if s1[i] == 'A':
                    temp.pop(0)
                else:
                    temp.pop(-1)
                s1.pop(i)
                break
    if len(set(s1)) == 1:
        res = min(s.count('A'),res)
    return res
if __name__ == '__main__':
    print('示例1 输出:',solve('BAAABAB'))
    print('示例2 输出:',solve('BBABBAA'))
    print('示例3 输出:',solve('AABBBB'))

评分

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

查看全部评分

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

使用道具 举报

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

我的方法好像有点笨:
import re


def my_answer(s, tar='AB'):
    flag = 0
    aabb = 0
    dist = {}
    if s.count('A') == 0 or s.count('B') == 0:
        return f'共需删除0个字符!\n字符串本身符合条件'
    else:
        for each in re.finditer(tar, s):
            if s.count('A') == s.count('B'):
                aabb = s.count('B')
                flag = 1
            else:
                sum = s.count('A', each.start() + 1, len(s)) + s.count('B', 0, each.start())
                if sum == 0:
                    flag = 2
                else:
                    dist[each.start()] = sum
        if flag == 0:
            min_index = min(dist, key=lambda k: dist[k])
            if dist[min_index] > s.count('A'):
                a = s.count('A')
                sb = s.replace('A', '')
                return f'共需删除{a}个字符!\n新字符串为{sb}'
            elif dist[min_index] > s.count('B'):
                a = s.count('B')
                sa = s.replace('B', '')
                return f'共需删除{a}个字符!\n新字符串为{sa}'
            else:
                sa = s[:min_index + 1].replace('B', '')
                sb = s[min_index + 1:].replace('A', '')
                return f'共需删除{dist[min_index]}个字符!\n新字符串为{sa + sb}'
        elif flag == 1:
            return f'共需删除{aabb}个字符!\n可以删除所有的 A 或 B'
        else:
            return f'共需删除0个字符!\n字符串本身符合条件'


print('示例1结果:', my_answer('BAAABAB'))
print('示例2结果:', my_answer('BBABAA'))
print('示例3结果:', my_answer('AABBBB'))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

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

使用道具 举报

发表于 2020-2-13 22:22:51 | 显示全部楼层
def fun331(s):
    flag = 'A'
    c = 0
    c_A = s.count('A')
    c_B = s.count('B')
    t = 0
    if (c_A == len(s)) or (c_B == len(s)):
        return 0
    for i in s:
        if i != flag:
            c += 1
            if t>0:
                flag = 'B'
        else:
            t += 1
    return min(c-1,c_A,c_B)

评分

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

查看全部评分

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

使用道具 举报

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

输入:

这个删除前面两个B最后两个A,不就是A开头,B结束,中间有AB的字符串了吗?A...AB...B到底是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-24 03:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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