设计|str增量法|计算贡献
lc2262
记录每个字符上一次出现的位置last
sum_g += i - last[c];
计算以当前字符结尾的子串新增的吸引力值并累加
最终得到所有子串的吸引力值总和
last 数组初始化为 -1
1.方便计算字符首次出现时对“吸引力”的贡献
2.还能让首次和后续出现的计算用同一个公式,简化逻辑
class Solution {
public:
long long appealSum(string s) {
vector<int> last(26, -1); // 初始化成 -1 可以让提示 2-2 中的两种情况合并成一个公式
long long ans = 0;
int sum_g = 0;
for (int i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
sum_g += i - last[c];
ans += sum_g;
last[c] = i;
}
return ans;
}
};
lc828
记录每个字符上一次last0和上上次last1出现的位置
计算每个位置对唯一字符数的贡献
total += i - 2 * last0[c] + last1[c];
累加得到所有子串唯一字符数的总和
class Solution {
public:
int uniqueLetterString(string s) {
int ans = 0, total = 0, last0[26], last1[26];
memset(last0, -1, sizeof(last0));
memset(last1, -1, sizeof(last1));
for (int i = 0; i < s.length(); ++i)
{
char c = s[i] - 'A';
total += i - 2 * last0[c] + last1[c];
ans += total;
last1[c] = last0[c];
last0[c] = i;
}
return ans;
}
};
lc3484
模拟简易表格
用hash存cell,可set/reset单元格值
getvalue 计算形如“=A1+2”or“=B3+C5”的加法结果
class Spreadsheet
{
unordered_map<string, int> data;
public:
Spreadsheet(int) {}
void setCell(string cell, int value) {
data[cell] = value;
}
void resetCell(string cell) {
data.erase(cell);
}
int getValue(string formula) {
int i = formula.find('+');
string s = formula.substr(1, i - 1);
string t = formula.substr(i + 1);
// 注意 s 不在 data 中的时候,data[s] 会把 s 插入 data,这里从简没有判断
return (isupper(s[0]) ? data[s] : stoi(s)) +
(isupper(t[0]) ? data[t] : stoi(t));
}
};