确定字符串中的所有字符在C ++中是否唯一

时间:2014-10-26 14:27:10

标签: c++

尝试用C ++实现一个相当简单的程序。我对这种语言有点新意。但它似乎没有起作用。

#include <iostream>
#include <string>


using namespace std;

bool isUnique(string);

int main(){
    bool uniq;
    string a;
    cout << "Please input a string, not a very long one...."<< endl;
    getline(cin, a);
    uniq = isUnique(a);
    if (uniq == true)
        {
            cout << "The string has no repeatations." <<endl;
        }else{
            cout << "The characters in the string are not unique." <<endl;
        }
    return EXIT_SUCCESS;


}

bool isUnique(string str){

int len = strlen(str);
bool uniq = true;

for (int i = 0; i <= len; ++i)
    {
        for (int j = i+1; j <= len; ++j)
        {
            if (str[j] == str[i])
            {
                uniq = false;
            }
        }
    }
return uniq;

}

程序编译但我想有一些逻辑错误。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分:3)

唯一性的一个简单标准是在排序的字符范围内没有重复的字符。标准库中有algorithms

#include <algorithm>  // for std::sort, std::unique
#include <iostream>   // for std::cin, std::cout
#include <string>     // for std:getline, std::string

int main()
{
    std::string input;

    std::cout << "Please input a string, not a very long one: ";
    std::getline(input, std::cin);

    std::sort(input.being(), input.end());
    bool u = std::unique(input.begin(), input.end()) == input.end();

    if (u) { std::cout << "Every character is unique.\n"; }
    else   { std::cout << "The string contains repeated characters.\n"; }
}

作为优化,如果字符串的字符多于唯一字符,则可以提前退出,但是您需要某种方法来确定该数字是什么。

答案 1 :(得分:1)

如果没有嵌套循环,您可以更轻松地检查唯一性:创建一个bool[256]数组,将char强制转换为unsigned char,并将其用作数组的索引。如果设置了bool,则字符不是唯一的;否则,它们是独一无二的。

bool seen[256];
for (int i = 0 ; i != str.length() ; i++) {
    unsigned char index = (unsigned char)str[i];
    if (seen[index]) return false;
    seen[index] = true;
}
return true;

这个想法很简单:你标记你去过的人物,如果你看到一个“标记”字符,则返回false。如果到达末尾而不返回,则所有字符都是唯一的。

该算法为O(n);你的算法是O(n 2 )。但是,这并没有多大区别,因为不可能构造一个长度超过256个字符的唯一字符串。

答案 2 :(得分:0)

您正在使用字符串,因此无需将其转换为char数组。使用字符串进行检查。您可以这样检查:

bool isUnique(string str){

    for (std::string::size_type i = 0; i < str.size(); ++i)
        {
         if(i < str.size()-1){                                             
            for (std::string::size_type j = i+1; j < str.size(); ++j)
            {
                if (str[j] == str[i])
                {
                    uniq = false;
                }
            }
         }
        }
    return uniq;
}

答案 3 :(得分:0)

您的代码中有太多错误。例如,而不是

int len = sizeof(arr)/sizeof(*arr);

应该有

size_t len = std::strlen( arr );

或者代替

for (int i = 0; i <= len; ++i)

至少应该

for (int i = 0; i < len; ++i)

等等。

并且无需定义字符数组。类std::string具有完成任务所需的全部功能。

尝试以下功能

bool isUnique( const std::string &s )
{
    bool unique = true;

    for ( std::string::size_type i = 0; i < s.size() && unique; i++ )
    {
        std::string::size_type j = 0;
        while ( j < i && s[j] != s[i] ) ++j;

        unique = j == i;
    }

    return unique;
}

这是一个示范程序

#include <iostream>
#include <iomanip>
#include <string>

bool isUnique( const std::string &s )
{
    bool unique = true;

    for ( std::string::size_type i = 0; i < s.size() && unique; i++ )
    {
        std::string::size_type j = 0;
        while ( j < i && s[j] != s[i] ) ++j;

        unique = j == i;
    }

    return unique;
}

int main() 
{
    std::string s( "abcdef" );

    std::cout << std::boolalpha << isUnique( s ) << std::endl;

    s = "abcdefa";

    std::cout << std::boolalpha << isUnique( s ) << std::endl;

    return 0;
}

输出

true
false

答案 4 :(得分:0)

以下是修复错误的代码:

#include <iostream>

using namespace std;

bool isUnique(string,int); //extra parameter

int main(){
    bool uniq;
    string a;
    cout << "Please input a string, not a very long one...."<< endl;
    getline(cin, a);
    uniq = isUnique(a,a.length()); //pass length of a
    if (uniq == true)
        {
            cout << "The string has no repeatations." <<endl;
        }else{
            cout << "The characters in the string are not unique." <<endl;
        }
    return EXIT_SUCCESS;


}

bool isUnique(string str,int len){

    bool uniq = true;

    for (int i = 0; i < len-1; ++i) //len-1 else j would access unitialized memory location in the last iteration
        {
            for (int j = i+1; j < len; ++j) //j<len because array index starts from 0
            {
                if (str[j] == str[i])
                {
                    uniq = false;
                }
            }
        }
    return uniq;
}

答案 5 :(得分:0)

你可以试试这个:

int main () {


    bool uniqe=false;
    string a;
    char arr[1024];
    int count[256]={0};
    cout << "Please input a string, not a very long one...."<< endl;
    getline(cin, a);
    strcpy(arr, a.c_str());
    for(int i=0;i<strlen(arr);i++)
      count[(int)(arr[i])]++;      // counting the occurence of character
    for(int i=0;i<256;i++){
     if(count[i]>1){       // if count > 1 means character are repeated.
         uniqe=false;
       break;
     }else{
        uniqe=true;

     }
    }
   if(uniqe)
      cout << "The string has no repeatations." <<endl;
    else
      cout << "The characters in the string are not unique." <<endl;


    return 0;
}