豆包MarsCode 刷题(六) | 豆包MarsCode AI刷题

198 阅读4分钟

本博客含有两道题目:最少字符串操作次数;构造回文字符串问题

最少字符串操作次数

问题描述

小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?

我的思路

  • 统计各个字符出现频率
  • 字符频率地板除2并累加
  • 返回结果

豆包思路

  1. 统计字符频率:首先,我们需要统计字符串中每个字符的出现频率。
  2. 计算操作次数:对于每个字符,如果它的出现次数超过1次,我们需要进行操作来减少重复字符的数量。
  3. 操作策略:每次操作可以减少两个相同的字符,因此对于每个字符,如果它的出现次数为 n,我们需要 (n - 1) 次操作来减少到1个。

对比思路可以发现豆包的思路存在一定的问题,可能是由于对题目的理解不够深入,在删除字符时是删除两个,而豆包的思路是一次只删除一个。

再给豆包提示之后,豆包也是合理的输出了思路

  1. 统计字符频率:首先,我们需要统计字符串中每个字符的出现频率。
  2. 计算操作次数:对于每个字符,如果它的出现次数超过1次,我们需要进行操作来减少重复字符的数量。每次操作可以删除两个相同的字符,并在字符串末尾添加一个任意的小写字母。
  3. 操作策略:每次操作可以减少两个相同的字符,因此对于每个字符,如果它的出现次数为 n,我们需要 n // 2 次操作来减少到0个或1个。

代码

from collections import Counter
​
def solution(S: str) -> int:
    # 统计字符频率
    char_count = Counter(S)
    
    # 初始化操作次数
    operations = 0
    
    # 遍历每个字符的频率
    for count in char_count.values():
        # 如果字符出现次数大于1,需要进行操作
        if count > 1:
            # 计算需要的操作次数
            operations += count//2
    
    return operations

构造回文字符串问题

问题描述

小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:

  1. t 由小写字母组成,且长度与 s 相同。
  2. t 是回文字符串,即从左到右与从右到左读取相同。
  3. t 的字典序要小于 s,并且在所有符合条件的字符串中字典序尽可能大。

小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1

我的思路:

  • 将给定字符串的前半部分为依据构造回文字符串

  • 如果构造的回文字符串比给定的字符串字典序小,则直接返回

  • 如果构造的回文字符串比给定的字符串字典序相等且均为a,则返回-1

  • 如果构造的回文字符串比给定的字符串字典序大,则判断给定的字符串的个数

    • 如果个数为奇数,判断中间位置是不是为a:

      • 如果为a,则将中间位置变为z,中间位置靠前的那个字符进行减一操作,并构造回文字符串
      • 否则,中间位置那个字符进行减一操作,并构造回文字符串
    • 如果个数为偶数,判断中间两个位置字符的大小:

      • 如果前一个字符小,则构造回文字符串
      • 如果前一个字符大或相等,则该字符进行减一操作,然后构造回文字符串

豆包思路

  1. 从中间位置开始:从字符串的中间位置开始,向两边扩展,检查是否可以构造出满足条件的回文字符串。
  2. 字符比较:从中间向两边扩展时,检查当前字符是否可以小于 s 对应位置的字符。
  3. 构造回文:如果找到合适的位置,构造回文字符串并返回。
  4. 边界情况:如果无法构造出满足条件的回文字符串,返回 -1

代码

def solution(s2: str) -> str:
    s=s2
    s=list(s)
    n=len(s)
    i,j=0,n-1
    b=0
    half=int(n/2)
    while(i<half):
        s[j]=s[i]
        i+=1
        j-=1
    s="".join(s)
    if(s<s2):return s
    elif(s==s2 and s[0]=="a"):return "-1"
    else :
        if(n%2==1):
            s=list(s)
            if(s[half]=="a"):
                s[half]="z"
                s[half-1]= chr(ord(s[half-1])-1)
                s[half+1]= s[half-1]
            else:s[half]= chr(ord(s[half])-1)
            s="".join(s)
            return s
        else:
            s=list(s)
            if(s2[half]<s2[half-1]):
                print(s2[half-1])
                s[half-1]=  chr(ord(s2[half-1])-1)
            elif (s2[half]==s2[half-1]):
                s[half-1]=  chr(ord(s2[half-1])-1)
            print(s[half-1])
            s[half]=s[half-1]
            s="".join(s)
            return s