我能够走出阵外界限

时间:2015-08-20 06:14:53

标签: c++ arrays

给定两个字符串,写一个方法来判断一个是另一个的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;
}

3 个答案:

答案 0 :(得分:3)

C ++数组中没有什么固有的东西阻止你写出超出它们的结尾。但是,这样做会违反您与编译器的契约,因此可以自由地执行它所希望的行为(未定义的行为)。

你可以检查&#34;数组&#34;使用vector课程,如果您需要的话。

至于更好的方法,如果你的阵列足够大,可以覆盖每个可能的角色,那么可能会更好(所以你不必担心边界检查)和它不应该是一个真值作为计数,以便处理字符串中的重复字符。如果它只是一个真值,则hereher将被视为字谜。

即使你声明它一项任务,如果你自己实施它,你仍然会学到更多,所以它只是来自我的伪代码。基本想法是:

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 :attributeC都没有执行C++

  

程序员有责任确保程序逻辑不超过合法限制。程序员需要检查违规行为

改进代码

index-out-of-bounds