尝试用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;
}
程序编译但我想有一些逻辑错误。任何帮助表示赞赏。
答案 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;
}