本博客含有两道题目:最少字符串操作次数;构造回文字符串问题
最少字符串操作次数
问题描述
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
我的思路
- 统计各个字符出现频率
- 字符频率地板除2并累加
- 返回结果
豆包思路
- 统计字符频率:首先,我们需要统计字符串中每个字符的出现频率。
- 计算操作次数:对于每个字符,如果它的出现次数超过1次,我们需要进行操作来减少重复字符的数量。
- 操作策略:每次操作可以减少两个相同的字符,因此对于每个字符,如果它的出现次数为
n,我们需要(n - 1)次操作来减少到1个。
对比思路可以发现豆包的思路存在一定的问题,可能是由于对题目的理解不够深入,在删除字符时是删除两个,而豆包的思路是一次只删除一个。
再给豆包提示之后,豆包也是合理的输出了思路
- 统计字符频率:首先,我们需要统计字符串中每个字符的出现频率。
- 计算操作次数:对于每个字符,如果它的出现次数超过1次,我们需要进行操作来减少重复字符的数量。每次操作可以删除两个相同的字符,并在字符串末尾添加一个任意的小写字母。
- 操作策略:每次操作可以减少两个相同的字符,因此对于每个字符,如果它的出现次数为
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,并且这个字符串需要满足以下几个条件:
t由小写字母组成,且长度与s相同。t是回文字符串,即从左到右与从右到左读取相同。t的字典序要小于s,并且在所有符合条件的字符串中字典序尽可能大。
小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1。
我的思路:
-
将给定字符串的前半部分为依据构造回文字符串
-
如果构造的回文字符串比给定的字符串字典序小,则直接返回
-
如果构造的回文字符串比给定的字符串字典序相等且均为a,则返回-1
-
如果构造的回文字符串比给定的字符串字典序大,则判断给定的字符串的个数
-
如果个数为奇数,判断中间位置是不是为a:
- 如果为a,则将中间位置变为z,中间位置靠前的那个字符进行减一操作,并构造回文字符串
- 否则,中间位置那个字符进行减一操作,并构造回文字符串
-
如果个数为偶数,判断中间两个位置字符的大小:
- 如果前一个字符小,则构造回文字符串
- 如果前一个字符大或相等,则该字符进行减一操作,然后构造回文字符串
-
豆包思路
- 从中间位置开始:从字符串的中间位置开始,向两边扩展,检查是否可以构造出满足条件的回文字符串。
- 字符比较:从中间向两边扩展时,检查当前字符是否可以小于
s对应位置的字符。 - 构造回文:如果找到合适的位置,构造回文字符串并返回。
- 边界情况:如果无法构造出满足条件的回文字符串,返回
-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