题目描述
读入一些字符串,将其中的空格去掉。
输入
输入为多行,每行为一个字符串,字符串只由字母、数字和空格组成,长度不超过80。输入以“End of file”结束。
输出
对于每行输入,输出转换后的字符串。
样例输入 Copy
Hello World 1 2 3 Nice to meet you abc
样例输出 Copy
HelloWorld 123 Nicetomeetyou abc
用scanf是不能读入一行有空格的字符串的,用gets吧。 用“gets(str) != NULL”可以判断输入是否结束,如果此条件为假(即gets(str) == NULL),则表示输入结束(对于本题)。
#include <iostream>
#include <sstream> // 包含字符串流相关的库
#include <string>
using namespace std;
int main() {
string line;
// 不断读取输入直到遇到 "End of file"
while (getline(cin, line) && line != "End of file") {
// 去除字符串中的空格
// 使用stringstream和string的组合可以方便地实现
stringstream ss(line);
string result;
string word;
while (ss >> word) { // 逐个读取单词
result += word; // 将单词拼接起来
}
// 输出结果
cout << result << endl;
}
return 0;
}
题目描述
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1. 删除一个字符;
2. 插入一个字符;
3. 将一个字符改为另一个字符。
对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
输入
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于200。
输出
只有一个正整数,为最少字符操作次数。
样例输入 Copy
sfdxbqw gfdgw
样例输出 Copy
4
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int minDistance(string word1, string word2) {
int m = word1.length();
int n = word2.length();
// 创建一个二维动态规划数组
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 初始化边界条件
for (int i = 0; i <= m; ++i) {
dp[i][0] = i; // 字符串word1转换为空字符串需要删除i个字符
}
for (int j = 0; j <= n; ++j) {
dp[0][j] = j; // 空字符串转换为字符串word2需要插入j个字符
}
// 填充dp数组
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (word1[i - 1] == word2[j - 1]) {
// 如果当前字符相等,则不需要操作
dp[i][j] = dp[i - 1][j - 1];
} else {
// 选择三种操作中的最小代价
dp[i][j] = min({dp[i - 1][j - 1] + 1, // 替换
dp[i][j - 1] + 1, // 插入
dp[i - 1][j] + 1}); // 删除
}
}
}
// 返回最终结果
return dp[m][n];
}
int main() {
string word1, word2;
cin >> word1;
cin >> word2;
cout << minDistance(word1, word2) << endl;
return 0;
}