CCF CSP 第35次(2024.09)(2_字符串变换_C++)
- 解题思路:
- 思路一(哈希表+getline):
- 代码实现
- 代码实现(思路一(哈希表+getline)):
时间限制: 1.0 秒
空间限制: 512 MiB
原题链接
解题思路:
思路一(哈希表+getline):
1、解题步骤拆分:
① 数据输入:
- 第一行输入字符串(string),需去掉首尾的#字符(含有空格使用getline)。
- 第二行输入一个正整数 n 。
- 接下来n行输入n个操作,格式为#xy# 将字符原先的x变为y(含有空格使用getline,注意上方有cin输入n则需消除回车)(为了快速的对应xy关系使用哈希表来存储) 。
- 接下来输入一个整数m,表述查询的个数。
- 接下来一行为m个正整数k1,k2…km。
② 数据处理:进行几次查询,就进行几次变换
③ 数据输出:进行相应的查询后输出,格式为:#string#
代码实现
代码实现(思路一(哈希表+getline)):
int main(int argc, char const *argv[])
{
string str;
// 获取一行的字符串(可以包含空格)
getline(cin, str);
// 去掉字符串的第一个和最后一个字符,通常是用于处理格式化字符串(如去除引号等)
str = str.substr(1, str.size() - 2);
// 使用哈希集合存储 n 个字符替换操作
int n;
cin >> n;
// 清除 cin 输入后的回车符,防止 getline 读取到不需要的换行符
cin.ignore();
string option;
// 创建一个无序映射(哈希表),用于存储字符的替换规则
unordered_map<char, char> x_y;
// 读取 n 个替换操作,填充哈希表
for (int i = 0; i < n; i++) {
// 读取替换操作(格式如 "x y")
getline(cin, option);
char x = option[1]; // 提取替换字符 x
char y = option[2]; // 提取替换字符 y
// 将字符 x 映射为字符 y
x_y[x] = y;
}
// 读取需要进行处理的次数 m
int m, k;
cin >> m;
string prestr = str; // 保存原始的字符串,用于后续每次替换操作的开始
// 循环 m 次,每次进行字符替换并打印结果
for (int i = 0; i < m; i++) {
// 读取整数 k,表示进行 k 次字符替换
cin >> k;
str = prestr; // 恢复原始字符串
// 执行 k 次字符替换
for (int j = 0; j < k; j++) {
// 遍历当前字符串中的每个字符
for (auto &c : str) {
// 如果字符 c 在哈希表中有对应的替换规则
if (x_y.count(c)) {
c = x_y[c]; // 替换字符 c 为对应的 y
}
}
}
// 输出经过 k 次替换后的字符串,格式为 "#str#"
cout << "#" << str << "#" << endl;
}
return 0;
}
欢迎大家和我沟通交流(✿◠‿◠)