【发布时间】:2020-12-30 07:25:31
【问题描述】:
任务:创建一个函数,如果两个字符串共享相同的字母模式,则返回 true,否则返回 false。
我找到了解决此任务的方法,但我认为它可以更简单、更简短。我将所有相同的字母转换为 2 个字符串的特定字符。然后过程结束检查它们是否相同。对于更简单的解决方案有什么想法吗?
#include <iostream>
#include <string>
using namespace std;
bool LetterPattern(string str1, string str2) {
// Controlling whether they have same size or not
if (str1.length() != str2.length()) {
return false;
}
else {
// Checking for ABC XYZ format type
int counter = 0;
for (int i = 0; i < str1.length()-1; i++) {
for (int k = i+1; k < str1.length(); k++) {
if (str1[i] == str1[k]) {
counter++;
}
}
}
int counter2 = 0;
for (int i = 0; i < str2.length() - 1; i++) {
for (int k = i + 1; k < str2.length(); k++) {
if (str2[i] == str2[k]) {
counter2++;
}
}
}
if (counter == 0 && counter2 == 0) {
return true;
}
// I added the above part because program below couldn't return 1 for completely different letter formats
// like XYZ ABC DEF etc.
//Converting same letters to same chars for str1
for (int i = 0; i < str1.length()-1; i++) {
for (int k = i+1; k < str1.length(); k++) {
if (str1[i] == str1[k]) {
str1[k] = (char)i;
}
}
str1[i] = (char)i;
}
}
//Converting same letters to same chars for str1
for (int i = 0; i < str2.length() - 1; i++) {
for (int k = i + 1; k < str2.length(); k++) {
if (str2[i] == str2[k]) {
str2[k] = (char)i;
}
}
str2[i] = (char)i;
}
if (str1 == str2) { // After converting strings, it checks whether they are same or not
return true;
}
else {
return false;
}
}
int main(){
cout << "Please enter two string variable: ";
string str1, str2;
cin >> str1 >> str2;
cout << "Same Letter Pattern: " << LetterPattern(str1, str2);
system("pause>0");
}
例子:
| str1 | str2 | result |
|---|---|---|
| AABB | CCDD | true |
| ABAB | CDCD | true |
| AAFFG | AAFGF | false |
| asdasd | qweqwe | true |
【问题讨论】:
-
也许只有我一个人,但我不完全确定“共享相同的后一种模式”是什么意思(我也无法从代码中解决)。你的意思是有一个共同的子序列?像往常一样,举几个例子会有所帮助。
-
好吧,我完全错了。您的意思是有一组字母替换可以将一个字符串转换为另一个字符串。 AFAIK 应该可以通过字符串和映射来解决,以记住您到目前为止使用的替换。