假设我们有一个字符串。在删除每次出现的特定字符后,我们必须最小化字符串中每个字符的ASCII值之和。假设给出一个字符串,如“ hello”,则ASCII字符的总和为(104 + 101 + 108 + 108 + 111)=532。现在检查每个字符的出现情况。
h发生过一次,因此成本为1 * 104 = 104
e发生过一次,因此成本为1 * 101 = 101
l发生过一次,因此成本为2 * 108 = 216
o发生过一次,因此成本为1 * 111 = 111
这里l发生的时间最长,因此,如果我们删除所有出现的l,则该值将最小化。因此,实际上我们从上面的列表中删除了最大值。最终结果将是532 – 216 = 316
首先,逻辑很简单,我们必须获取字符串的ASCII总和。然后计算字符串中每个字符的出现频率,然后删除在最大值* ASCII值中占最大值的那个字符。减去的值就是结果。
#include <iostream> using namespace std; int minASCIISum(string str, int len) { int max_val = INT_MIN, sum = 0; int frequency[26] = { 0 }; for (int i = 0; i < len; i++) { frequency[str[i] - 'a']++; sum += (int)str[i]; } for (int i = 0; i < 26; i++) max_val = max(max_val, frequency[i] * (i + 'a')); return (sum - max_val); } int main() { string str = "hello"; int n = str.length(); cout << "Minimized Sum: " << minASCIISum(str, n); }
输出结果
Minimized Sum: 316