Leetcode 30
看到一个无比无比聪明的做法,太佩服了。
思路:将words数组中每一个字符串编码为一个特定数字,使整个words数组加起来的和唯一。
使用unordered_map存储,那么为了和是唯一的,就使用左移,使每一个都为2的指数(1,2,4,8)
遍历被检测的字符串,将每一个能对应上words数组中某个字符串的位置,初始化为该字符串对应的数字
再次遍历被检测字符串,使用二层循环,遍历字符串中所有长度为words字符串字符长度的子串,只要子串满足数字之和等于words数组之和,即满足要求。
太巧妙了!善用左移的属性
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int slength=words[0].size();
int blength=words.size();
unordered_map<string,int> mapping;
for(int i=0;i<blength;i++)
{
int j=1;
mapping[words[i]]=j<<i;
}
int total=0;
for(int i=0;i<blength;i++)
{
total+=mapping[words[i]];
}
vector<int> list;
vector<int> result;
for(int i=0;i<s.size()-slength+1;i++)
{
list.push_back(mapping[s.substr(i,slength)]);
}
for(int i=0;i<s.size()-slength*blength+1;i++)
{
int sum=0;
for(int j=0;j<blength;j++)
{
sum+=list[i+j*slength];
}
if(sum==total)
{
result.push_back(i);
}
}
return result;
}
};
leetcode 31
觉得数据有漏洞?
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int size=nums.size();
int end=size-1;
while(end>0)
{
if(nums[end-1]<nums[end])
{
break;
}
else
{
end--;
}
}
if(end==0)
{
sort(nums.begin(),nums.end());
}
else
{
int min=nums[end];
int index=end;
//cout<<nums[end]<<" "<<end<<endl;
for(int i=size-1;i>end;i--)
{
if(nums[i]<=min&&nums[i]>nums[end-1])
{
min=nums[i];
index=i;
}
}
swap(nums[index],nums[end-1]);
sort(nums.begin()+end,nums.end());
}
}
};
leetcode32
对我来说难在正确理解题意……