字典序最小的01字符串题解| 豆包MarsCode AI刷题

72 阅读2分钟

写道困难题来写一篇题解来发布,但是呢这道题为困难题我觉得有点德不配位了。(也可能是我力扣刷过类似的题的缘故),好了废话不多说,请看题解。

这道题的题目是:给你一个只含01的字符串,和一个整数k,经过k次换位操作,求得到字典序最小的字符串。(换位操作只能是相邻位置的子字符)

1.首先先要明白什么是字典序:简单来说,类似于数字,从右往左看,最右边的为最小位,越往左越大,同位的就拿ascll码比较。这道题比较人性化,只有0和1,1的编码肯定是大于0的,所以我们变换的思路就得到的,尽量把0换到高位。

2.然后再考虑,什么时候最小,遍历方式肯定不是循环遍历整个字符串(别问我为什么知道的)按照上面说的字典序,靠左是高位,靠右是低位,改变靠右的子字符对整个字符串的字典序影响更大,所以说要尽量在左边进行操作

好了大致的思路就是这样,具体的请看代码

1.初始变量,将字符串s每一位分开,存入中

s = list(s)
do=0

遍历一次数组,找到‘0’所在,因为要尽量在左边操作,所以我的思路是从左边开始遍历,找到零,将它按照题目条件往高位换,换到它换无可换(换的条件是:s[i]=='1' and s[i-1]=='1')每次操作一次do加一,直到d=k,停止操作

for i in range(n):
        if s[i] == '0':
            # 找到当前 '0' 的位置,尝试将其移动到最前面
            j = i
            while j > 0 and s[j-1] == '1' and do < k:
                s[j], s[j-1] = s[j-1], s[j]
                j -= 1
                do += 1
            if do == k:
                break
    return ''.join(s)

这就是这题的所有思路,感觉就没有那么难,主要是要知道字典序的概念,然后经过一定的审题和分析就可以得到答案,并没有那么难,感觉不配困难题。下一篇得找道有含金量的题来写。 最后完整代码附上

def solution(n: int, k: int, s: str) -> str:
    # write code here
    do=0
    new_s=list(s)
    for i in range(n):
        if new_s[i]=='0':
            j=i
            while j>0 and new_s[j-1]=='1' and do<k:
                new_s[j],new_s[j-1]=new_s[j-1],new_s[j]
                do+=1
                j-=1
            if do==k:break
    return ''.join(new_s)

if __name__ == '__main__':
    print(solution(5, 2, "01010") == '00101')
    print(solution(7, 3, "1101001") == '0110101')
    print(solution(4, 1, "1001") == '0101')