c++代码问题 求大神指导

题目要求:编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。

#include
#include
using namespace std;
int main()
{
string str;
cin >> str;
int j=0,p;
for (int i =0; i <= str.size() - 1; i++)
{

 if(str[i]>=0&&str[i]<=127)
    {
        for(int k =0; k<i; k++)
        {
            p=0;
            if(str[k]==str[i])
                p=1;
        }
        if(p!=1)
            j++;

    }
}
cout<<j;
return 0;

}

我的代码自己测试的时候么问题 但是提交的时候系统给的测试字符串答案就不对 请问是怎么会事呢??

测试用例:
uqic^g`(s&jnl(m#vt!onwdj(ru+os&wx

对应输出应该为:

24

你的输出为:

33

谢谢!币不多 不要嫌弃!

原程序将此处:
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i])
p=1;
}

改为:
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i]){
p=1;
break;
}
}

把for循环改一下,结束条件不对

 for (int i =0; i <= str.size() - 1; i++)
{

    if(str[i]>=0&&str[i]<=127)
    {
        for(int k =0; k<i; k++)
        {
            if(str[k]==str[i])
                break;
        }
    }
}

你这逻辑有问题,
for(int k =0; k<i; k++)
{
p=0;
if(str[k]==str[i])
p=1;
}
if(p!=1)
j++;
即使执行了
if(str[k]==str[i])
p=1;
接下来的循环中也会执行 p=0;

建议直接开一个大小为128的数组,初始化为0,然后将出现过的字母的ACSII码下标标记为1, 然后将数组累加起来。
比如 出现 ABC
则数组下标为65,66,67的值为1,累加起来就是3。

 #include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    string str;
    cin >> str;
    int j=0,p;
    for (int i =0; i <= str.size() - 1; i++)
    {
        p = 0;
         if(str[i]>=0&&str[i]<=127)
         {
             for(int k =0; k<i; k++)
             {
                 if(str[k]==str[i])
                 {
                     p=1;
                     break;
                 }
             }


         }
        if(p!=1)
                 j++;
    }
    cout<<j;
    return 0;
}

上面的有错

 #include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    string str;
    cin >> str;
    int j=0,p;
    for (int i =0; i <= str.size() - 1; i++)
    {

         if(str[i]>=0&&str[i]<=127)
         {
             p = 0;
             for(int k =0; k<i; k++)
             {
                 if(str[k]==str[i])
                 {
                     p=1;
                     break;
                 }
             }
             if(p!=1)
                 j++;

         }

    }
    cout<<j;
    return 0;
}

//这个时间复杂度为o(n)。 很不错的方法。

#include
#include
using namespace std;
int main()
{
string str;
cin>>str;
char table[128]={0};
int j=0;
for (int i =0; i <= str.size() - 1; i++)
{
if(table[str[i]] == 0)
table[str[i]] = 1;
else
j++;//重复的字符

}
cout<<str.size()-j;
return 0;

}


 for(int k =0; k<i; k++)
        {
            p=0;
            if(str[k]==str[i])
                p=1;
        }

这段代码在p=1;后加上break;语句,查找到重复的跳出循环;你原来的代码中未跳出循环,结果p可能最终又变为了0.

int main(){
    string str,temp="";
    cin>> str;
    for (int i=0; i<str.size(); i++) {
        if(str[i]>=0&&str[i]<=127){
            if (!contains(temp, str[i])) {
                temp+=str[i];
            }
        }
    }
    cout<<temp.size();
    return 0;
}

bool contains(string str,char c){
    bool b=false;
    for (int i=0;i<str.size();i++) {
        b|=str[i]==c;
    }
    return b;
}


int main(){
    string str,temp="";
    cin>> str;
    for (int i=0; i<str.size(); i++) {
        if(str[i]>=0&&str[i]<=127){
            if (!contains(temp, str[i])) {
                temp+=str[i];
            }
        }
    }
    cout<<temp.size();
    return 0;
}

bool contains(string str,char c){
    bool b=false;
    for (int i=0;i<str.size();i++) {
        b|=str[i]==c;
    }
    return b;
}


string str;
vectorv1;
cin >> str;
for (int i = 0; i < str.size(); i++)
{
if (str[i]>127 || str[i] < 0)
throw runtime_error("超出ASIIC码范围" + str[i]);
v1.push_back(str[i]);//放到容器中
}
sort(v1.begin(), v1.end());
auto end_unique = unique(v1.begin(), v1.end());
v1.erase(end_unique, v1.end());
cout << v1.size();
return 0;
}
这边的主要思路是,先将str里的字符进行排序,然后消除掉相邻处相同的字符,此时,字符的长度就是所有不同字符的个数了

hash array or map