c++ - 查找和打印不同字符串中的常用字母

标签 c++ string loops

我需要查找并打印不同字符串中的常见字符。我的代码无法正常工作,它在相同的索引处检查相同的字母,但这不是我想要的。我暂时找不到更好的解决方案。谢谢你的帮助 :)

#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 :
Try it online!

#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 :
Try it online!
#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加上set_intersection标准函数。这将解决您的任务in less time,而不是O(N*log(N))时间。
变体3 :
Try it online!
#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
除了O(N^2)之外,还可以使用set,它将提供更快的算法,尤其是对于长字符串,与unordered_set解决方案的O(N)相比,算法的运行时间为O(N * log(N))。唯一的缺点是,与set解决方案不同,set解决方案的输出未排序(但唯一)(无序集不会对其数据进行排序)。
变体4 :
Try it online!
#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
还有一种方法是像您一样,仅使用普通的unordered_set循环,不使用任何设置,而是使用额外的循环块来删除非唯一字母,如下面的代码所示。与sets方法相比,此loops方法的唯一缺点是loops方法运行速度较慢,并且会生成未排序的输出字符串。
变体5 :
Try it online!
#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

关于c++ - 查找和打印不同字符串中的常用字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64673484/

相关文章:

string - 严格将字符串转换为 int

Javascript 奇怪的循环行为

javascript - 在 JavaScript 中无限打印到控制台整数之间的值

c++ - 如何配置 Clion 以使用 SDL2?

c++ - 遍历文件系统的最快方法

c++ - std::具有相同基类的类的变体

c - 为什么我的程序陷入无限循环?

c - 如何在 C 中将单词作为变量?

c# - 在循环中使用 NEW 时,将项目添加到对象的 LIST<> 会导致重复的对象

c++ - 为 IPv6 服务器选择监听地址(双栈)