给定两个字符串,写一个方法来判断一个是另一个的anagram / permutation。这是我的方法:
我写了这个函数来检查2个字符串是否是字谜(例如狗和上帝)。
在ascii中,a到z是97 - 122。
基本上我有一系列bool,最初都是假的。每次我遇到string1中的char时,都会将其标记为true。
要检查它是否是一个字谜,我检查string2的字符是否为false(如果在string1中遇到则应该为true)。
我不知道怎么做但也有效:arr [num] = true; (不应该工作因为我没有考虑到ascii从97开始因此超出界限)。
(旁注:是否有比我更好的方法?)
编辑:感谢所有回复!将仔细阅读每一个。顺便说一下:不是作业。这是编码面试练习册中的一个问题
bool permutation(const string &str1, const string &str2)
{
// Cannot be anagrams if sizes are different
if (str1.size() != str2.size())
return false;
bool arr[25] = { false };
for (int i = 0; i < str1.size(); i++) // string 1
{
char ch = (char)tolower(str1[i]); // convert each char to lower
int num = ch; // get ascii
arr[num-97] = true;
}
for (int i = 0; i < str2.size(); i++) // string 2
{
char ch = (char)tolower(str2[i]); // convert char to lower
int num = ch; // get ascii
if (arr[num-97] == false)
return false;
}
return true;
}
答案 0 :(得分:3)
C ++数组中没有什么固有的东西阻止你写出超出它们的结尾。但是,这样做会违反您与编译器的契约,因此可以自由地执行它所希望的行为(未定义的行为)。
你可以检查&#34;数组&#34;使用vector
课程,如果您需要的话。
至于更好的方法,如果你的阵列足够大,可以覆盖每个可能的角色,那么可能会更好(所以你不必担心边界检查)和它不应该是一个真值作为计数,以便处理字符串中的重复字符。如果它只是一个真值,则here
和her
将被视为字谜。
即使你声明它不一项任务,如果你自己实施它,你仍然会学到更多,所以它只是来自我的伪代码。基本想法是:
def isAnagram (str1, str2):
# Different lengths means no anagram.
if len(str1) not equal to len(str2):
return false
# Initialise character counts to zero.
create array[0..255] (assumes 8-bit char)
for each index 0..255:
set count[index] to zero
# Add 1 for all characters in string 1.
for each char in string1:
increment array[char]
# Subtract 1 for all characters in string 2.
for each char in string2:
decrement array[char]
# Counts will be all zero for an anagram.
for each index 0..255:
if count[index] not equal to 0:
return false
return true
答案 1 :(得分:1)
工作方法:零额外费用。
bool permutation(const std::string &str1, const std::string &str2)
{
// Cannot be anagrams if sizes are different
if (str1.size() != str2.size())
return false;
int arr[25] = {0 };
for (int i = 0; i < str1.size(); i++) // string 1
{
char ch = (char)tolower(str1[i]); // convert each char to lower
int num = ch; // get ascii
arr[num-97] = arr[num-97] + 1 ;
}
for (int i = 0; i < str2.size(); i++) // string 2
{
char ch = (char)tolower(str2[i]); // convert char to lower
int num = ch; // get ascii
arr[num-97] = arr[num-97] - 1 ;
}
for (int i =0; i< 25; i++) {
if (arr[i] != 0) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
是的,filter :attribute
和C
都没有执行C++
。
程序员有责任确保程序逻辑不超过合法限制。程序员需要检查违规行为。
改进代码:
index-out-of-bounds