这道题有很多人都用的什么字符串哈希或者别的一些法子,这里作者用了暴力的解法。
思路:关键点在于我们怎么存储所给出的字符串容器中每个字符串的子串的编号并加以处理。
这里用到了一种嵌套容器:vector
好了,这样的问题大部分就解决了,我们之所以用暴力的原因是因为这里的数据范围非常的小,足够我们用暴力进行处理。
注意:里面为什么会对于m[n][i]进行计数,这个东西相当于对比器,就是存储的是所有字符串所拥有的子串的个数,而为什么直接比较m[i][当前字串]与m[n][当前字串],是因为m[i][当前子串]是对于它对应的一个字符串的子串,是一定只有一个的,而m[n][当前子串]就不一样了,这个是全部字符串的子集的个数计数,这样一比较才能知道这个子集是不是只出现了一次。
第三重循环当中为什么初始值设为j,是因为防止所截取的字符串个数是0.
上代码:
- class Solution {
- public:
- vector<string> shortestSubstrings(vector<string>& arr) {
- int n=arr.size();
- vector<map<string,int>>m(n+1);
- for(int i=0;i<n;i++){
- string buf=arr[i];
- for(int j=0;j<buf.size();j++){
- for(int k=j;k<buf.size();k++){
- m[i][buf.substr(j,k-j+1)]++;
- m[n][buf.substr(j,k-j+1)]++;
- }
- }
- }
- vector<string>res(n);
- for(int i=0;i<n;i++){
- string buf=arr[i];
- for(int j=0;j<buf.size();j++){
- for(int k=j;k<buf.size();k++){
- if(m[i][buf.substr(j,k-j+1)]==m[n][buf.substr(j,k-j+1)]){
- if(res[i].empty())res[i]=buf.substr(j,k-j+1);
- if(res[i].size()>buf.substr(j,k-j+1).size())
- res[i]=buf.substr(j,k-j+1);
- else if(res[i].size()==buf.substr(j,k-j+1).size())
- res[i]=min(res[i],buf.substr(j,k-j+1));
- }
- }
- }
- }
- return res;
- }
- };