题目传送门
思路:
1. 统计字符数量
首先,我们需要统计字符串中每个字符(从'0'到'9')的出现次数。这可以通过遍历字符串并使用一个大小为10的数组来实现,数组的每个位置对应一个数字,存储该数字在字符串中出现的次数。
2. 检查2014串的形成条件
一个有效的2014串是由若干个"2014"子串拼接而成的。因此,我们需要检查字符串中'2'、'0'、'1'和'4'的数量是否满足以下条件:
- 字符串中'2'的数量必须等于'0'的数量,且等于'1'的数量,且等于'4'的数量。
- 这些字符的数量必须是4的倍数,因为每个"2014"子串的长度是4。
3. 模拟交换操作
虽然题目允许任意多次交换操作,但实际上我们不需要具体模拟每一步交换操作。只要字符串中'2'、'0'、'1'和'4'的数量满足上述条件,我们就可以断定可以通过交换操作将字符串变成2014串。
4. 判断结果
根据上述分析,如果字符串中'2'、'0'、'1'和'4'的数量满足条件,则输出"Yes";否则输出"No"。
具体实现步骤
- 输入字符串长度和字符串:读取输入的整数
n
和字符串S
。 - 统计字符数量:遍历字符串
S
,统计每个字符的出现次数。 - 检查2014串的形成条件:检查'2'、'0'、'1'和'4'的数量是否满足上述条件。
- 输出结果:根据检查结果输出"Yes"或"No"。
代码&解释:
c++代码:
#include<iostream>
using namespace std;
int n;
int two = 0,zero = 0,one = 0,four = 0;
string str;
int main(){
cin >> n;
cin >> str;
for(int i = 0;i < str.size();i++){
if(str[i] != '2' && str[i] != '0' && str[i] != '1' && str[i] != '4'){
cout<<"No"<<endl;
return 0;
} else if(str[i] == '2') two++;
else if(str[i] == '0') zero++;
else if(str[i] == '1') one++;
else if(str[i] == '4') four++;
}
if(two == n / 4 && zero == n / 4 && one == n / 4 && four == n / 4) cout<<"Yes"<<endl;
else cout << "No" << endl;
return 0;
}
代码解释:
-
引入库和命名空间:
- 使用输入输出流库,方便进行数据的输入和输出。
-
变量声明:
- 定义变量
n
来存储字符串的长度。 - 计数变量用于分别记录字符'2'、'0'、'1'和'4'在字符串中出现的次数。
- 定义一个字符串变量用于存储输入的实际字符串。
- 定义变量
-
输入操作:
- 从输入中读取字符串的长度及该字符串的内容。
-
遍历字符串:
- 使用循环逐个检查字符串中的字符。
- 如果遇到非'2'、'0'、'1'、'4'的字符,立即输出"No"并结束程序,以确保字符串只包含这些特定字符。
- 根据当前字符更新对应的计数值。
-
检查计数:
- 在遍历结束后,判断四个计数是否都等于字符串长度的1/4。只有在所有字符满足这个条件时,才能形成一个或多个完整的"2014"子串。
- 根据判断结果输出相应的"Yes"或"No"。
Python代码:
n = int(input())
s = input()
count = {'2': 0, '0': 0, '1': 0, '4': 0}
for char in s:
if char in count:
count[char] += 1
else:
print("No")
exit()
# 检查每个字符的数量是否都是n/4
if count['2'] == n / 4 and count['0'] == n / 4 and count['1'] == n / 4 and count['4'] == n / 4:
print("Yes")
else:
print("No")
代码解释:
-
输入操作:
- 使用
input()
函数读取字符串的长度和内容。
- 使用
-
字符计数:
- 使用字典
count
来记录'2'、'0'、'1'和'4'的出现次数。 - 遍历字符串中的每个字符,更新对应的计数。如果遇到非这些字符的字符,立即输出"No"并退出程序。
- 使用字典
-
检查条件:
- 在遍历结束后,检查每个字符的计数是否等于字符串长度的1/4。
- 如果满足条件,输出"Yes";否则输出"No"。
Pascal代码(现打的,仅供参考):
program Check2014String;
var
n: Integer;
s: string;
count2, count0, count1, count4: Integer;
i: Integer;
begin
readln(n);
readln(s);
count2 := 0;
count0 := 0;
count1 := 0;
count4 := 0;
for i := 1 to n do
begin
if s[i] = '2' then
count2 := count2 + 1
else if s[i] = '0' then
count0 := count0 + 1
else if s[i] = '1' then
count1 := count1 + 1
else if s[i] = '4' then
count4 := count4 + 1
else
begin
writeln('No');
exit;
end;
end;
// 检查是否能够形成完整的"2014"子串
if (n mod 4 = 0) and (count2 = n div 4) and
(count0 = n div 4) and (count1 = n div 4) and
(count4 = n div 4) then
writeln('Yes')
else
writeln('No');
end.
代码解释:
-
输入长度:
- 需要确保输入的长度
n
是4的倍数,否则字符串不可能被分解成完整的"2014"子串。因此增加了n mod 4 = 0
的检查。
- 需要确保输入的长度
-
计数逻辑:
- 计数部分保持不变,它会统计'2'、'0'、'1'和'4'的出现次数。
-
最终判断:
- 如果字符的数量满足条件,并且
n
是4的倍数,则可以构成多个"2014"子串,输出"Yes";否则输出"No"。
- 如果字符的数量满足条件,并且