最初の行は全てタイプするしかない。
それ以外は、
1.直前のバッファにそのまま付け足す。
2.履歴からプレフィックスに一致する文をもってくる。
3.バッファを消して全てタイプする。
- string pref(string a, string b)
- {
- string c;
- for (int i = 0; i < min(a.size(), b.size()); ++i) {
- if (a[i] == b[i]) c += a[i];
- else break;
- }
- return c;
- }
- class UndoHistory {
- public:
- int minPresses(vector <string> ls)
- {
- int ret = 0;
- const int click = 2;
- const int enter = 1;
- for (int i = 0; i < ls.size(); ++i) {
- int mn = ls[i].size();
- if (i) {
- if (ls[i - 1].size() == pref(ls[i], ls[i - 1]).size()) {
- int diff = ls[i].size() - ls[i - 1].size();
- mn = min(mn, diff);
- } else {
- mn += click;
- }
- }
- for (int j = 0; j < i; ++j) {
- string comm = pref(ls[i], ls[j]);
- int m = click + (ls[i].size() - comm.size());
- mn = min(mn, m);
- }
- ret += mn + enter;
- }
- return ret;
- }
- };