确定字符互异

本文介绍了一种不使用额外存储结构的方法来判断给定字符串中所有字符是否唯一。通过双重循环比较每个字符与其他字符,确保了算法的时间复杂度为O(1)。此方法适用于ASCII字符组成的字符串,长度不超过3000。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。


思路:对于字符串的重复判断,根据字符数量256个,题目不能使用额外存储空间,可以依次将每一个字符和其他字符比较(即双重循环),O(n^2)的时间复杂度,这里的n可以限制在256以内,其实是O(1)!!!时间复杂度


class Different {
public:
    bool checkDifferent(string iniString) {
        // write code here
        int len=iniString.length();
        if(len>256)
            return false;
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                if(iniString[i]==iniString[j])
                    return false;
            }
        }
        return true;
        }
};




要在 C++ 中实现一个算法来判断给定的字符串中的所有字符是否都是唯一的,并输出 "YES" 或者 "NO" 来表示结果,你可以按照下面的方式编写程序: ### 实现思路 1. **使用集合 (Set) 数据结构**:由于集合不允许重复元素存在,我们可以利用这一特性将字符串中的每个字符尝试加入到集合中。 - 如果某次插入操作失败了(即该字符已经在集合里),就说明遇到了重复字符; - 若遍历完整个字符串都没有遇到重复情况,则可以确定所有的字符都是唯一的。 2. **直接比较法**:对于每一个新读取进来的字符,在它之前的所有字符中进行查找是否有相同的字符;如果有则不是唯一,反之则是唯一的。这种方法的时间复杂度较高O(n^2),当数据量较大时不推荐采用此办法。 这里我们优先选择第一种基于 Set 的高效解决方案来进行编实践。 ```cpp #include <iostream> #include <unordered_set> // 使用无序集合作为容器存储已访问过的字符 using namespace std; string checkUniqueChars(const string& inputStr) { unordered_set<char> charSet; // 定义一个空置的哈希表(无序集合) for(auto ch : inputStr){ if(charSet.find(ch)!=charSet.end()){ return "NO"; // 发现重复项立即返回 } else { charSet.insert(ch); // 插入当前处理的新字符至set内 } } return "YES"; // 遍历完成均未发现重复,则表明各字符互异 } int main() { string userInput; cout << "请输入需要检测的字符串(长度不超过100):" ; cin >> userInput; // 输入待验证的文本串 if(userInput.length()>100 || userInput.empty()){ cerr << "错误: 字符串长度超出限制或为空!" << endl; exit(EXIT_FAILURE); } cout << ((checkUniqueChars(userInput))=="YES"? "YES":"NO")<<endl; } ``` 上述代片段展示了如何通过 `std::unordered_set` 检测输入字符串是否存在非独占性的字母组成,以此判定其内部各个符号间是否具备独特性质。如果全部检验完毕没有找到任何一个重复出现过的成分,最终便会给出肯定的答案——“YES”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值