89 lines
2.5 KiB
C++
89 lines
2.5 KiB
C++
#include<bits/stdc++.h>
|
|
using namespace std;
|
|
|
|
class Solution{
|
|
public:
|
|
int uniqueLetterString(string s){
|
|
const int constraint_length = s.size() + 10;
|
|
const int ch_nums = 26;
|
|
const int first_char = (int)'A';
|
|
|
|
// store the distance, first is the distance to the previous charactor, second is the distance to the next char
|
|
pair<int,int> ch_dist[constraint_length];
|
|
//index store index from 1
|
|
int index[ch_nums] = {};
|
|
|
|
// try to find the distance
|
|
for(int i = 0 ; i < s.size() ; i++){
|
|
const int word_th = s[i] - first_char;
|
|
ch_dist[i + 1].first = i + 1 - index[word_th];
|
|
if(index[word_th] != 0)
|
|
ch_dist[index[word_th]].second = i + 1 - index[word_th];
|
|
index[word_th] = i + 1;
|
|
}
|
|
|
|
for(int i = 0 ; i < ch_nums ; i++){
|
|
if(index[i]!=0){
|
|
ch_dist[index[i]].second = s.size() + 1 - index[i];
|
|
// cout<<i<<' '<<s.size()<<'+'<<1<<'-'<<index[i]<<'='<<s.size() + 1 - index[i]<<endl;
|
|
}
|
|
}
|
|
|
|
for(int i = 1 ; i < s.size() + 1 ; i++){
|
|
// cout<< i<<' '<< ch_dist[i].first<< ' '<< ch_dist[i].second<<' '<<index[s[i-1]-'A']<<endl;
|
|
}
|
|
|
|
long long rlt = 0;
|
|
|
|
for(int i = 1 ; i < s.size() + 1 ; i++){
|
|
rlt += ch_dist[i].first + ch_dist[i].second - 1;
|
|
|
|
int pre, nxt;
|
|
|
|
// if(i == ch_dist[i].first){
|
|
// pre = i - 1;
|
|
// }
|
|
// else{
|
|
// pre = i - ch_dist[i].first ;
|
|
// }
|
|
|
|
// if(i == index[s[i - 1]-'A'])
|
|
// nxt = s.size() - i;
|
|
// else
|
|
// nxt = ch_dist[i].second ;
|
|
pre = ch_dist[i].first - 1;
|
|
nxt = ch_dist[i].second - 1;
|
|
rlt += pre * nxt;
|
|
|
|
// cout<<pre<<' '<<nxt<<endl;
|
|
|
|
}
|
|
return rlt ;
|
|
|
|
}
|
|
};
|
|
|
|
|
|
|
|
int main(){
|
|
Solution sol;
|
|
string ex1 = "ABC";
|
|
cout<<ex1<<endl;
|
|
cout<<sol.uniqueLetterString(ex1)<<endl;
|
|
string ex2 = "ABA";
|
|
cout<<ex2<<endl;
|
|
cout<<sol.uniqueLetterString(ex2)<<endl;
|
|
string ex3 = "LEETCODE";
|
|
cout<<ex3<<endl;
|
|
cout<<sol.uniqueLetterString(ex3)<<endl;
|
|
string ex4 = "ABCD";
|
|
cout<<ex4<<endl;
|
|
cout<<sol.uniqueLetterString(ex4)<<endl;
|
|
string ex5 = "ABAC";
|
|
cout<<ex5<<endl;
|
|
cout<<sol.uniqueLetterString(ex5)<<endl;
|
|
string ex6 = "ABACA";
|
|
cout<<ex6<<endl;
|
|
cout<<sol.uniqueLetterString(ex6)<<endl;
|
|
return 0;
|
|
} |