题目链接
题目描述
小红喜欢吃多彩糖葫芦,多彩糖葫芦上的每一个糖葫芦都有一种颜色。但小红有非常严重的强迫症,她绝对不会连续吃两个相同颜色的糖葫芦。一串糖葫芦只能从上往下吃,一旦小红发现下一颗糖葫芦和她刚吃过的糖葫芦颜色相同时,小红就会把整串多彩糖葫芦丢掉。小红想知道她吃一串多彩糖葫芦时可以吃到几颗糖葫芦。
输入:
- 一个字符串,表示多彩糖葫芦串上从上到下每一颗糖葫芦的颜色
输出:
- 一个整数,表示小红最多能吃到的糖葫芦数量
解题思路
这是一个模拟问题,可以通过以下步骤解决:
-
关键发现:
- 小红只能从上往下吃
- 遇到相同颜色就会停止
- 需要记录上一个吃的糖葫芦的颜色
-
模拟策略:
- 从第一个糖葫芦开始吃
- 记录上一个吃的糖葫芦颜色
- 如果下一个糖葫芦颜色相同,就停止
- 否则继续吃并更新上一个颜色
-
具体步骤:
- 遍历字符串
- 维护上一个颜色和已吃数量
- 遇到相同颜色就退出循环
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 1; // 第一个糖葫芦一定能吃
char last = s[0]; // 记录上一个颜色
for(int i = 1; i < s.length(); i++) {
if(s[i] == last) { // 遇到相同颜色就停止
break;
}
last = s[i]; // 更新上一个颜色
ans++; // 可以吃这个糖葫芦
}
cout << ans << endl;
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int ans = 1; // 第一个糖葫芦一定能吃
char last = s.charAt(0); // 记录上一个颜色
for(int i = 1; i < s.length(); i++) {
if(s.charAt(i) == last) { // 遇到相同颜色就停止
break;
}
last = s.charAt(i); // 更新上一个颜色
ans++; // 可以吃这个糖葫芦
}
System.out.println(ans);
}
}
s = input()
ans = 1 # 第一个糖葫芦一定能吃
last = s[0] # 记录上一个颜色
for i in range(1, len(s)):
if s[i] == last: # 遇到相同颜色就停止
break
last = s[i] # 更新上一个颜色
ans += 1 # 可以吃这个糖葫芦
print(ans)
算法及复杂度
- 算法:模拟
- 时间复杂度:
- 最多需要遍历整个字符串
- 空间复杂度:
- 只需要常数空间存储变量