c++ - 查找和打印不同字符串中的常见字母
问题描述
我需要在不同的字符串中查找和打印常见字符。我的代码不能正常工作,它会检查相同索引处的相同字母,但这不是我想要的。我暂时找不到更好的解决方案。谢谢你的帮助 :)
#include <iostream>
#include <string>
using namespace std;
int main() {
string niz1, niz2, niz3 = "";
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
for (int i = 0; i < niz1.length() - 1; i++) {
for (int j = 0; j < niz2.length() - 1; j++) {
if (niz1[i] == niz2[j])
niz3 += niz1[i];
}
}
cout << "Same letters are: " << niz3 << endl;
return 0;
}
解决方案
下面是更正的工作代码。基本上,唯一需要做的更正是使两个循环都具有上限niz.length()
而不是niz.length() - 1
.
变体 1:
#include <string>
#include <iostream>
using namespace std;
int main() {
string niz1, niz2, niz3 = "";
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
for (int i = 0; i < niz1.length(); i++) {
for (int j = 0; j < niz2.length(); j++) {
if (niz1[i] == niz2[j])
niz3 += niz1[i];
}
}
cout << "Same letters are: " << niz3 << endl;
return 0;
}
输入:
string 1: adbc
string 2: cde
输出:
Same letters are: dc
此外,您可能想要对字母进行排序并使它们独一无二,那么您也需要std::set
像下面的代码一样使用:
变体 2:
#include <string>
#include <iostream>
#include <set>
using namespace std;
int main() {
string niz1, niz2, niz3 = "";
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
for (int i = 0; i < niz1.length(); i++) {
for (int j = 0; j < niz2.length(); j++) {
if (niz1[i] == niz2[j])
niz3 += niz1[i];
}
}
set<char> unique(niz3.begin(), niz3.end());
niz3.assign(unique.begin(), unique.end());
cout << "Same letters are: " << niz3 << endl;
return 0;
}
输入:
string 1: adbcda
string 2: cdecd
输出:
Same letters are: cd
您也可以只使用set
s plusset_intersection
标准功能。这将在更短的时间内解决您的任务,O(N*log(N))
而不是您的O(N^2)
时间。
变体 3:
#include <string>
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
string niz1, niz2, niz3 = "";
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
set<char> s1(niz1.begin(), niz1.end()), s2(niz2.begin(), niz2.end());
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(niz3));
cout << "Same letters are: " << niz3 << endl;
return 0;
}
输入:
string 1: adbcda
string 2: cdecd
输出:
Same letters are: cd
代替set
它也可以使用unordered_set
,它将提供更快的算法,尤其是对于长字符串,算法与解决方案相比将具有运行O(N)
时间。唯一的缺点是,与解决方案不同,解决方案的输出是未排序的(但唯一的)(无序集不会对其数据进行排序)。O(N * log(N))
set
set
unordered_set
变体 4:
#include <string>
#include <iostream>
#include <unordered_set>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
string niz1, niz2, niz3;
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
unordered_set<char> s1(niz1.begin(), niz1.end()), s2;
for (size_t i = 0; i < niz2.length(); ++i)
if (s1.count(niz2[i]))
s2.insert(niz2[i]);
niz3.assign(s2.begin(), s2.end());
cout << "Same letters are: " << niz3 << endl;
return 0;
}
输入:
string 1: adbcda
string 2: cdecd
输出:
Same letters are: dc
还有一种方法是for
像你一样只使用普通循环,不使用集合,但是执行额外的循环块以删除非唯一字母,如下面的代码所示。与 sets 方法相比,此循环方法的唯一缺点是 loops 方法运行速度较慢并产生未排序的输出字符串。
变体 5:
#include <string>
#include <iostream>
using namespace std;
int main() {
string niz1, niz2, niz3, niz4;
cout << "string 1: ";
getline(cin, niz1);
cout << "string 2: ";
getline(cin, niz2);
for (int i = 0; i < niz1.length(); ++i)
for (int j = 0; j < niz2.length(); ++j)
if (niz1[i] == niz2[j])
niz3 += niz1[i];
for (int i = 0; i < niz3.length(); ++i) {
bool exists = false;
for (int j = 0; j < niz4.length(); ++j)
if (niz4[j] == niz3[i]) {
exists = true;
break;
}
if (!exists)
niz4 += niz3[i];
}
cout << "Same letters are: " << niz4 << endl;
return 0;
}
输入:
string 1: adbcda
string 2: cdecd
输出:
Same letters are: dc
推荐阅读
- regex - 使用 Perl 脚本将数字替换为 XML 文件中的字符串
- unit-testing - 如何使用 Mockito 使用 lambda 模拟内联函数
- graphql - Gatsby 的 markdown 文件之间的映射
- python - py2app ImportError:没有名为 sip 的模块
- python - 与 Numpy Python 索引相关的方程式
- javascript - Vuejs iframe 干扰路由器
- python - 用scrapy提取图像
- multithreading - kthread停止而没有运行
- google-cloud-spanner - golang spanner 测试库在一段时间后崩溃
- deep-learning - 在 Ubuntu 20.04 上安装 ROCm 失败