如何在不使用数组的情况下执行此操作? 我有这个实现,但我需要在不使用数组,位操作和任何其他C / C ++库的情况下完成它。
bool IsCharDuplication(string s) {
bool result = false;
bool controlArray[256];
for (int i = 0; i < s.length(); i++) {
int val = s[i];
if (controlArray[val] == true) {
result = true;
break;
}
controlArray[val] = true;
}
return result;
}
答案 0 :(得分:5)
使用两个嵌套循环:
bool IsCharDuplication(string s)
{
for (int i = 0; i < s.length(); i++)
for (int j = i+1; j < s.length(); j++)
if (s[i] == s[j])
return true;
return false;
}
注意: 您的算法的时间为O(N),但我的解决方案的时间为O(N ^ 2)。
答案 1 :(得分:5)
你可以做得比其他答案中建议的O(N ^ 2)算法更好。
例如,您可以对O(NlogN)中的字符串进行快速排序或合并排序,然后对排序的字符串执行单次传递,以确定O(N)中是否存在任何重复项。总时间复杂度为O(NlogN)。
bool IsCharDuplication (string s)
{
string s2 = sort(s);
for (int i = 0; i < s.length () - 1; i++)
if (s2[i] == s2[i+1])
return true;
return false;
}
我没有包含排序字符串的代码,但您可以轻松找到这样的代码并编写自己的sort
方法(因为您不允许使用C / C ++库)。
答案 2 :(得分:0)
您必须使用哈希表(或哈希集)来获得O(n)复杂性。以下实现使用按位运算,其中每个位对应于字母表中的每个字符。
/**
* Works for 0-127 ASCII string. Assuming, int is 16 bit.
**/
int isduplicate(const char* str){
int hash[8]={0,0,0,0,0,0,0,0};
while(*str){
int pos=*str;
if(hash[pos/16]&(1<<(pos%16)))
return 1;
hash[pos/16]|=(1<<(pos%16));
str++;
}
return 0;
}
答案 3 :(得分:-1)
// ASCII assumed over unicode
// O(n) algorithm
// O(1) space
bool isUnique(string s) {
// cannot exceed number of unique characters
if (s.length() > 256) return false;
bool checker[256];
for (int i = 0; i < s.length(); i++) {
int val = s.at(i);
if (checker[val] == true)
return false;
checker[val] = true;
}
return true;
}