c++ - 使用哈希映射在c ++中查找字符串中的第一个唯一元素的问题
问题描述
int firstUniqChar(std::string s) {
//Using maps to find the first unique character of the string
int string_len;
int pos;
std::unordered_map<char, int> m{};
string_len = s.size();
for (int i = 0; i < string_len; i++) {
//if the char in string is not present in map, then add to the map with a
//frequency of 1.
if(m.find(s[i]) == m.end()) {
m.insert(std::make_pair(s[i], 1));
} else {
m[s[i]]++;
}
}
for(std::unordered_map<char, int>::iterator it = m.begin(); it != m.end(); ++it) {
if (it->second == 1) {
int index = std::distance(m.begin(), it);
return index;
}
}
return -1;
}
我正在尝试使用 C++ 中的映射来查找字符串中的第一个唯一元素。虽然我能够计算元素的频率,但代码不会返回第一个唯一元素。与地图中的排序有关。我如何获得第一个独特的元素。
添加另一个不涵盖所有情况的数组代码
int main() {
std::string s = "aadadaad";
int len = s.length();
if (len == 1) {
return 0;
}
for (int i = 0; i < len; i++) {
bool found = true;
for (int j = i + 1; j < len; j++) {
if (s[i] == s[j]) {
found = false;
break;
}
}
if ((i != len - 1) && (found == true)) {
std::cout << i << std::endl;
return i;
}
}
std::cout << "-1" << std::endl;
return -1;
}
解决方案
您返回的是无序地图的第一个元素。第一个元素与字符串的第一个唯一元素无关。
你应该做的是,一旦你计算了频率,再次迭代字符串并返回频率为 1 的第一个字符。
PS 如果您可以假设一个 8 位字节 - 这可能是一个合理的假设 - 那么只有 256 个不同的值。一个可能更有效的解决方案是使用 256 个元素的数组,而不是 hashmap。请注意,您需要转换为 unsigned char 才能使用字符作为索引。
推荐阅读
- php - 如何将复选框表单插入类型集的数据库属性
- python - 我应该如何着手引入我希望在定义中同时成为全局变量的变量?
- hostname - 网络设备主机名是由设备本身还是网络管理员确定的?
- azure - Azure 媒体服务 (v3) - 特定的输出资产容器名称
- html - td 中宽度为 100% 的 div 不占据整个 td 并且左侧为 100%、200% 等似乎不包括边框
- angular - Angular Material:需要额外的交互来触发渲染
- python - Numpy 和 Pandas - 用零填充重塑
- python - 如何对熊猫中的多列组进行求和或计数
- swift - 使用 Dart 将 Swift 数据转换为字符串格式
- c++ - 当对象被删除时,复制已删除对象的对象呢?