T1. 循环移位后的矩阵相似检查
$\quad$分类讨论,枚举每一个字符偏转$k$位以后的位置,比较两个位置上的字符串是否相同。在枚举的 候,需要提前将$k$取模
class Solution {
public:
bool areSimilar(vector<vector<int>>& mat, int k) {
int n = (int)mat[0].size();
int m = (int)mat.size();
bool flag=true;
k%=n;
cout<<k<<endl;
for(int i = 0 ; i < m ;i++)
{
if(i%2!=0)
{
for(int j = 0 ;j < n ;j++)
if(mat[i][j]!=mat[i][(j + k)%n])
{
// cout<<i<<' '<<j<<endl;
flag=false;
}
}
else
{
for(int j = n - 1 ; j >= 0 ;j --)
{
if( j >= k )
{
if( mat[i][j]!=mat[i][j - k])
{
// cout<<i<<' '<<j<<endl;
flag=false;
}
}else
{
if( mat[i][j]!=mat[i][n - 1 - (k - j - 1)])
{
cout<<i<<' '<<j<<endl;
flag=false;
}
}
}
}
}
return flag;
}
};
T2.统计美丽子字符串 I
$\quad$ $Easy$版本,我们考虑枚举所有可能的字符串,然后用前缀来保存每一段字符串中的,元音和辅音的数量。
class Solution {
public:
int beautifulSubstrings(string s, int k) {
int n = (int)s.length();
vector<int>a( n , 0);
vector<int>b( n , 0);
for(int i = 0 ; i < n ;i++)
{// 'a'、'e'、'i'、'o' 和 'u' 。
if(s[i] =='a' || s[i] =='e' || s[i] == 'i' || s[i] == 'o' || s[i] =='u')
{
a[i] = 1;
}else b[i ] = 1;
}
for(int i = 1 ;i < n ;i++)a[i] += a[ i - 1] , b[i] += b[ i - 1];
int ans = 0;
for(int l = 0 ; l < n ; l++)
{
for(int r = l ; r < n ; r ++)
{
int vowels = a[r] - (l?a[ l - 1] : 0);
int consonants = b[r] - (l?b[l - 1]: 0);
if(vowels == consonants && (consonants * vowels)%k ==0) ans++;
}
}
return ans;
}
};
T3.交换得到字典序最小的数组
$\quad$考虑限制$ | nums_{i} - nums_{j} | <= limit$,事实上在数组确定之后,通过这个限制能够交换的数字就会自动的组成若干个集合,集合中的任意元素之间,均可以两两交换。
$\quad$因此,我们在最开始的时候就将这个集合处理从出来,之后从左到右输出方案的过程中,只需要输出,当前位置所属集合的还存在的数中的最小值即可。
typedef pair<int,int>PII;
#define x first
#define y second
class Solution {
public:
vector<int> lexicographicallySmallestArray(vector<int>& nums, int limit) {
int n = (int)nums.size();
vector<PII>a;
for(int i = 0 ; i < (int)nums.size();i++)a.push_back({nums[i],i});
vector<int>id(n);
sort(a.begin(),a.end());
int idx = 0;
priority_queue<int,vector<int>,greater<int>>q[n];
for(int l = 0, r = 1 ; l < n; l = r )
{
id[a[l].y] = idx;
q[idx].push(a[l].x);
r = l + 1;
while(r < n && a[r].x - a[r - 1].x <= limit)
{
id[a[r].y] = idx;
q[idx].push(a[r].x);
r++;
}
idx ++ ;
}
// for(int i = 0 ; i < n ;i++)cout<<i<<' '<<id[i]<<endl;
vector<int>ans;
for(int i = 0 ; i < n ; i++)
{
int t = id[i];
ans.push_back(q[t].top());q[t].pop();
}
return ans;
}
};
T4.统计美丽子字符串 II
$\quad$参考
class Solution {
public:
int qmi(int a,int b)
{
int res = 1;
while(b)
{
if(b&1)res = res * a;
a = a * a;
b>>=1;
}
return res;
}
const int mask = 1065233;
long long beautifulSubstrings(string s, int k) {
int x = 1 , n = (int)s.length();
int t = 4 * k;
for(int i = 2 ; i <= t / i ; i++)
{
int s = 0 ;
while( t % i == 0)t/=i,s++;
if(s) x *= qmi(i,(s + 1)/2);
}
if(t > 1)x *= t;
map<pair<int,int>,int>mp;
int ans = 0 ;
int sum = 0 ;
for(int i = 0 ; i < n ;i++)
{
sum += 2 * (mask>>(s[i] - 'a')&1) - 1;
ans += mp[{sum,i%x}] + (sum==0&&( i + 1)%x==0);
mp[{sum,i%x}]++;
}
return ans;
}
};
// 12
//3 * 2 ^2
//L % 5 ==0