做题笔记:字符串修改最少次数计算
问题描述
小C有一个由数字字符组成的字符串,她想对这个字符串进行修改,使修改后的字符串中没有连续相同的字符。她需要计算至少进行多少次修改,才能确保字符串中的每两个连续字符不同。
测试样例
样例1:
输入:
s = "111222333"
输出:3
样例2:
输入:
s = "11551111"
输出:4
样例3:
输入:
s = "1234567890"
输出:0
问题分析
要解决这个问题,我们需要确保字符串中没有连续相同的字符。我们可以通过以下步骤来实现:
解题思路
-
理解问题:
- 我们需要计算最少需要多少次修改,才能使字符串中没有连续相同的字符。
- 例如,对于字符串 "111222333",我们需要将其修改为 "121212312",这样就没有连续相同的字符了。
-
遍历字符串:
- 从第二个字符开始,逐个检查当前字符是否与前一个字符相同。
- 使用一个循环来遍历字符串,从索引1开始(即第二个字符)。
-
计数修改:
- 如果当前字符与前一个字符相同,则需要进行一次修改,并将计数器加1。
- 例如,在字符串 "111222333" 中,第一个 "11" 需要修改一次,第二个 "22" 需要修改一次,第三个 "33" 需要修改一次。
-
跳过连续字符:
- 在发现连续相同的字符时,我们可以跳过这些字符,因为它们已经被修改了。
- 例如,在字符串 "111222333" 中,发现 "11" 后,我们可以跳过第二个 "1",继续检查后面的字符。
-
返回结果:
- 最后返回计数器的值,即为最少需要修改的次数。
- 例如,对于字符串 "111222333",最少需要修改3次。
代码分析
-
初始化计数器:
- 你需要一个计数器来记录修改的次数。
-
遍历字符串:
- 使用一个循环从第二个字符开始遍历字符串。
-
检查连续字符:
- 在循环中,检查当前字符是否与前一个字符相同。
-
计数修改:
- 如果当前字符与前一个字符相同,则增加计数器,并跳过当前字符。
-
返回结果:
- 最后返回计数器的值
代码框架
changes = 0 # 初始化计数器
i = 1 # 从第二个字符开始遍历
while i < len(s):
if s[i] == s[i - 1]: # 检查当前字符是否与前一个字符相同
changes += 1 # 增加计数器
# 跳过当前字符,因为它已经被修改了
i += 1 # 跳过当前字符
i += 1 # 继续检查下一个字符
return changes # 返回计数器的值
# 测试样例
print(solution("111222333")) # 输出:3
print(solution("11551111")) # 输出:4
print(solution("1234567890")) # 输出:0
关键步骤解释
-
初始化计数器:
changes = 0:初始化一个计数器,用于记录修改的次数。
-
遍历字符串:
i = 1:从第二个字符开始遍历。while i < len(s)::使用循环遍历字符串。
-
检查连续字符:
if s[i] == s[i - 1]::检查当前字符是否与前一个字符相同。
-
计数修改:
changes += 1:如果当前字符与前一个字符相同,则增加计数器。i += 1:跳过当前字符,因为它已经被修改了。
-
返回结果:
return changes:返回计数器的值。
实现代码
changes = 0
i = 1
while i < len(s):
if s[i] == s[i - 1]:
changes += 1
# 跳过当前字符,因为它已经被修改了
i += 1
i += 1
return changes
# 测试样例
print(solution("111222333")) # 输出:3
print(solution("11551111")) # 输出:4
print(solution("1234567890")) # 输出:0
总结与反思
这道题主要考察以下几个编程和算法方面的知识点:
-
字符串操作:
- 遍历字符串:通过索引访问字符串中的每个字符。
- 比较字符:检查当前字符是否与前一个字符相同。
-
计数器和循环:
- 使用计数器来记录需要进行的修改次数。
- 使用循环来遍历字符串,并在发现连续相同的字符时进行计数。
-
逻辑判断:
- 在循环中进行逻辑判断,确定是否需要进行修改。
- 根据判断结果更新计数器。
-
边界条件处理:
- 处理字符串的边界条件,确保不会越界访问字符串。
- 例如,从第二个字符开始遍历,避免索引越界。
-
算法优化:
- 通过跳过连续相同的字符来优化算法,减少不必要的比较次数。