这是关于解决hackerrand中一个问题的方法。请点击链接:
the link of problem description
string reverseShuffleMerge(string s) {
int n = s.length();
vector<char> sarr(s.rbegin(), s.rend());
int alpha_size = 26;
vector<int> freq(alpha_size, 0);
for (int i = 0; i < n; i++) {
freq[sarr[i] - 'a']++;
}
vector<int> did_use(alpha_size, 0);
vector<int> can_use(freq.begin(), freq.end());
vector<char> A;
for (int i = 0; i < n; i++) {
if (did_use[sarr[i] - 'a'] < freq[sarr[i] - 'a'] / 2) {
while (A.size() > 0 && sarr[i] < A.back()
&& did_use[A.back() - 'a'] + can_use[A.back() - 'a'] - 1
>= freq[A.back() - 'a'] / 2) {
did_use[A.back() - 'a']--;
A.pop_back();
}
A.push_back(sarr[i]);
did_use[sarr[i] - 'a']++;
can_use[sarr[i] - 'a']--;
} else {
can_use[sarr[i] - 'a']--;
}
}
return string(A.begin(), A.end());
}
我不明白这条线的意思:did_use [A.back()-'a'] + can_use [A.back()-'a']-1> = freq [A.back() -'a'] / 2
任何人都可以帮助阐明这条线在解决方案中扮演的角色吗?
答案 0 :(得分:0)
在此问题中,字符串 s 中所有字符的频率将为偶数。答案将包含这些字符的一半。例如,如果s="aaaabbcc"
,则答案必须包含2
a,1
b和1
c。
因此did_use[A.back() - 'a'] + can_use[A.back() - 'a'] - 1 >= freq[A.back() - 'a'] / 2
这是因为如果我们删除了A.back()
个字符,我们是否可以在后面添加/制作所需数量的A.back()
个字符以及其余的字符串。