我如何了解hackerrank中一个问题的具体解决方案?

时间:2018-11-20 10:16:18

标签: algorithm

这是关于解决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

任何人都可以帮助阐明这条线在解决方案中扮演的角色吗?

1 个答案:

答案 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()个字符以及其余的字符串。