计数最低号码.char.从两个字符串中删除以使它们成为字眼
Counting minimum no. of char. to delete from two strings to make them anagrams
我已经写下以下功能以返回否。从两个字符串中删除的字符以使其成为字符。
int number_needed(string a, string b) {
static int c;
for(int i=0;i<=a.length();i++) //loop over string a
{ char ch=a[i];
int found=b.find(ch);
if( found==string::npos) //if character at a[i] not found in b
{
a.erase(i,1); //delete character in a[i]
c++; //inc. count c
}
}
for(int i=0;i<=b.length();i++) // repeat above looping for b string
{ char ch=b[i];
int found=a.find(ch);
if( found==std::string::npos)
{
b.erase(i,1);
c++;
}
}
return c; //finaly return no. of char. deleted
}
我想知道我是否做得正确,以及我的想法在问题的背景下是否还好。另外,您能否让我理解以下有关解决方案的问题的代码。
int number_needed(string a, string b) {
auto count = 0;
vector<int> freq(26, 0);
for (auto c : a) { ++freq[c - 'a']; }
for (auto c : b) { --freq[c - 'a']; }
for (auto val : freq) { count += abs(val); }
return count;
}
回答有关主题的第二部分:
vector<int> freq(26, 0);
该向量将保留字符串中字母的出现数量。
for (auto c : a) { ++freq[c - 'a']; }
通过字母浏览弦乐。如果您不熟悉for
语法Google的新内容,则基本上意味着foreach letter c in string a
。auto
零件告诉编译器从迭代的内容中推断迭代器的类型 - 在这种情况下,字符串a
。
c-'a'
将字母转换为索引。所有字母连续出现在ASCII char表中(char to int映射到int),因此删除第一个字母" a",将其更改为0到26之间的索引。请注意,这仅适用于低案例字母:'a'-'a'
= 0, 'b'-'a
= 1等转换为整数时。因此,我们每当看到字符中的字母中的字母出现,每当我们看到字母中的出现。
for (auto c : b) { --freq[c - 'a']; }
在第二个字符串上执行相同的操作,这次删除了频率。如果字母在a
中出现更多的次,则该字母的freq
将是正量过剩的,如果在b
中出现更多的情况,则具有适当的过量。
for (auto val : freq) { count += abs(val); }
总结过量的 - 绝对值处理b
的负多余。
正如GreatContini所注意到的那样,您不保留重复的计数。
相关文章:
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 删除字符串后C++检测到堆损坏
- 如何在 c++ 中删除字符串中的某些字符?
- 删除字符串数组
- 删除字符串中具有相同值的任何相邻字母"pair"
- 删除字符串向量中的字符重复
- 如何在Qt中删除字符串(qstring)中的子字符串
- 删除字符串指针在struct中的内存
- 删除 C 字符串中的大写字母
- 如何搜索和删除字符串中的字符
- 如何删除字符串中的所有空格并将数据存储在两者之间
- 删除字符串中不平衡的括号
- 删除字符串数组中的换行符
- 如何修复我的代码以删除字符串中的空格
- 如何删除字符串所有可能的子字符串中带有空格的子字符串?
- 如何创建删除 C 字符串中所有选定字符的函数
- 传递GTK回调时,请在C 中删除字符串向量
- 为什么删除字符串迭代器会产生const char参考
- 从<string>向量<int>中定义的索引处的向量中删除字符串
- 如何使用 c++ 剪切或删除字符串中的某些字符