开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个仅由字符 '0' 和 '1' 组成的字符串 s 。一步操作中,你可以将任一 '0' 变成 '1' ,或者将 '1' 变成 '0' 。
交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 "010" 是交替字符串,而字符串 "0100" 不是。
返回使 s 变成 交替字符串 所需的 最少 操作数。
示例 1:
输入: s = "0100"
输出: 1
解释: 如果将最后一个字符变为 '1' ,s 就变成 "0101" ,即符合交替字符串定义。
示例 2:
输入: s = "10"
输出: 0
解释: s 已经是交替字符串。
示例 3:
输入: s = "1111"
输出: 2
解释: 需要 2 步操作得到 "0101" 或 "1010" 。
提示:
1 <= s.length <= 104s[i]是'0'或'1'
二、思路分析
这题一开始把我难倒了。我知道这类题一定有一些巧妙的处理方法。果不其然,由于最终要求的字符串必须是0101010之类不相同的,所以第一个字符必然只有两种情况:0或1。而第二个字符也就必然根据第一个字符固定了下来,也就是说,一共就只可能有两种情况。
同时,要意识到,两种情况所要进行的操作数加起来就等于字符串的长度。
最后,字符'0'的ascii码为48,利用这一点就可以实现字符'0'-字符'9'与数字0-9的转换。
三、AC代码
class Solution {
public:
int minOperations(string s) {
int result=0;
for(int i=0;i<s.size();i++){
if(s[i]!=('0'+i%2)){
result++;
}
}
result=result<s.size()-result ? result : s.size()-result;
return result;
}
};
提交排名
四、总结
又了解到了一些知识点。