C ++检查字符串中的重复项

时间:2015-04-03 06:00:45

标签: c++ string

我有一个函数counter(string s1, string s2),它接受​​两个字符串(大小为4)作为参数。当s1是用户输入时,s2是随机生成的。

int counter(string s1, string s2){
    int count = 0;
    int i, j;
    if(i != j){
        for(i = 0; i < 4; i++){
            for(j = 0; j < 4; j++){
                if(s2[i] != s2[j] && s2[j] == s1[i]){
                        count += 1;
                }
            }
        }
    }
    return count;
}

此功能的作用是将s2s1的每个元素进行比较。如果s2的元素等于s1的元素,只要它们没有相同的索引或位置,count增加1.但是,函数在遇到问题时会遇到问题。 s2包含重复项。例如,如果s1 = 1234s2 = 4445,则输出应为1,但我的程序会输出3。我应该如何检测字符串中的重复项?

忘了提这个,但是s1(随机生成的字符串)有不同的字符。

4 个答案:

答案 0 :(得分:0)

我敢说。但是我把你的问题弄坏了我的问题=)

int counter(string s1, string s2){
    int count = 0;
    for(int i = 0; i < s1.length(); ++i)
    {
        string::size_type loc = s2.find(s1[i], 0);
        while (loc != string::npos)
        {
           if(loc != i) 
               ++count;
           loc = s2.find(s1[i], loc + 1);
        }
    }
    return count;
}

答案 1 :(得分:0)

在for循环中添加if条件,

int counter(string s1, string s2){
        int count = 0;
        int i, j;
         for(i = 0; i < 4; i++){
                for(j = 0; j < 4; j++){
                    if(i!=j && s2[j] == s1[i]){
                            count += 1;
                    }
                }
            }
        }
        return count;
    }

答案 2 :(得分:0)

这样可以解决S2中多次出现相同字母时遇到的问题。

int counter(string s1, string s2){
    int count = 0;
    int i, j;
        for(i = 0; i < 4; i++){
            for(j = 0; j < 4; j++){
                if(i != j){
                    if(s2[j] == s1[i]){
                            count += 1;
                            break;       // Break out of inner for-loop
                                         // to avoid counting letters twice
                    }
                }
            }
        }
    return count;
}

但是,我不确定你希望程序在S1中多次出现相同的字母时要做什么。

编辑: 在阅读了评论中的一些说明之后,if语句应该是

if(s2[i] != s2[j] && s2[j] == s1[i]){
像在原帖中一样。

答案 3 :(得分:0)

您可以通过实施 Levenshtein距离算法来检测重复元素。

 int levenshtein(const char *s, int ls, const char *t, int lt){
    int a, b, c;

    /* if either string is empty, difference is inserting all chars 
     * from the other
     */
    if (!ls) return lt;
    if (!lt) return ls;

    /* if last letters are the same, the difference is whatever is
     * required to edit the rest of the strings
     */
    if (s[ls] == t[ls])
            return levenshtein(s, ls - 1, t, lt - 1);

    /* else try:
     *      changing last letter of s to that of t; or
     *      remove last letter of s; or
     *      remove last letter of t,
     * any of which is 1 edit plus editing the rest of the strings
     */
    a = levenshtein(s, ls - 1, t, lt - 1);
    b = levenshtein(s, ls,     t, lt - 1);
    c = levenshtein(s, ls - 1, t, lt    );

    if (a > b) a = b;
    if (a > c) a = c;
    return a + 1;}