C语言:如何将字符转字符串用于strcmp以实现字符去重?
检查26字母字符串是否无重复字符的实现方案
首先,你的代码存在语法和逻辑错误,先逐一修正并实现需求:
一、原代码的问题点
- 函数定义缺少
{,语法不完整 - 直接将
char类型赋值给std::string不合法,需要显式构造单字符字符串 - for循环条件错误,应该遍历字符串的所有字符对,而非
a < verify[a] - 仅用单层循环无法完成所有字符的两两比较,需要嵌套循环
- 实际上不需要用strcmp,单个字符可以直接用
==比较,这是更简单高效的方式
二、如果一定要用strcmp实现(字符转字符串的方法)
要将单个字符转为可用于strcmp的字符串,有两种方式:
- 构造
std::string:用string(1, 字符)生成仅含该字符的字符串,再通过c_str()方法转为C风格字符串供strcmp使用 - 构造C风格字符数组:创建长度为2的char数组,第一个元素是目标字符,第二个是结束符
'\0'
以下是修正后的代码:
#include <string> #include <cstring> using namespace std; bool is_valid_key(string verify) { // 先判断输入长度是否为26,不符合直接返回false if (verify.size() != 26) { return false; } for (int a = 0; a < 26; a++) { // 构造单字符字符串供strcmp使用 string s1(1, verify[a]); for (int b = a + 1; b < 26; b++) { string s2(1, verify[b]); // strcmp接收const char*,所以用c_str()转换 if (strcmp(s1.c_str(), s2.c_str()) == 0) { return false; // 发现重复,返回无效 } } } return true; // 无重复,返回有效 }
三、更简单高效的直接字符比较方案
既然是单个字符比较,完全不需要用到strcmp,直接用==比较字符即可,代码更简洁:
#include <string> using namespace std; bool is_valid_key(string verify) { if (verify.size() != 26) { return false; } for (int i = 0; i < 26; i++) { for (int j = i + 1; j < 26; j++) { if (verify[i] == verify[j]) { return false; } } } return true; }
四、最优性能方案(利用字母范围特性)
因为输入是26个字母(假设是大小写其中一种,比如小写),可以用一个布尔数组标记已出现的字符,时间复杂度O(n):
#include <string> using namespace std; bool is_valid_key(string verify) { if (verify.size() != 26) { return false; } bool seen[26] = {false}; // 初始化所有元素为false for (char c : verify) { // 假设输入是小写字母,转成0-25的索引 int idx = c - 'a'; // 如果已经标记过,说明重复 if (seen[idx]) { return false; } seen[idx] = true; } return true; }
注意:如果输入可能包含大小写字母,需要先统一转换为小写或大写再处理,比如tolower(c)。
内容的提问来源于stack exchange,提问作者Sizwe
相关产品推荐
相关产品推荐

