A 统计包含给定前缀的字符串
4min,合理
- 贪心
class Solution {
public:
bool isS(string a , string b){
if(a.size() < b.size()) return false ;
int cnt = 0 ;
for(int i = 0 ; i < b.size() ; i ++){
if(a[i] == b[i]) cnt ++ ;
}
if(cnt == b.size()) return true ;
else return false ;
}
int prefixCount(vector<string>& words, string pref) {
int ans = 0 ;
for(int i = 0 ; i < words.size() ; i ++ ){
if(isS(words[i] , pref)) ans ++ ;
}
return ans ;
}
};
B 使两字符互为字母异位词的最少步骤
34min,离大谱。
- 双指针,sort 后四种情况逐个判断
class Solution {
public:
int minSteps(string s, string t) {
int ans = 0 ;
sort(s.begin() , s.end()) ;
sort(t.begin() , t.end()) ;
int i = 0 , j = 0 ;
while(i < s.size() && j < t.size()){
if(s[i] < t[j]){
i ++ ;
ans ++ ;
}
else if(s[i] > t[j]){
j ++ ;
ans ++ ;
}
else{
if(i + 1 < s.size() && j + 1 < t.size() && s[i + 1] == t[j] && t[j + 1] == s[i]){
i ++ ; j ++ ;
}
else if(i + 1 < s.size() && s[i + 1] == t[j]){
ans ++ ; i ++ ;
}
else if (j + 1 < t.size() && t[j + 1] == s[i]){
j ++ ; ans ++ ;
}
else{
i ++ ; j ++ ;
}
}
}
if(i < s.size()) ans += s.size() - i ;
if(j < t.size()) ans += t.size() - j ;
return ans ;
}
};
- No.1 的 code
class Solution {
int a[26];
public:
int minSteps(string s, string t) {
for(int i=0;i<s.size();i++) a[s[i]-'a']++;
for(int i=0;i<t.size();i++) a[t[i]-'a']--;
int ret=0;
for(int i=0;i<=25;i++) ret+=abs(a[i]);
return ret;
}
};
abs 绝对值。对应字母计数算差值。
C 完成旅途最少的时间
迷茫
- 超时
class Solution {
public:
long long minimumTime(vector<int>& time, int totalTrips) {
long long int ans = 0 ;
sort(time.begin() , time.end()) ;
while(totalTrips > 0){
ans ++ ;
for(int i = 0 ; i < time.size() ; i ++){
if(ans % time[i] == 0) totalTrips -- ;
}
}
return ans ;
}
};
- 二分
上一种方法考虑的是,每加一次时间长度,会多走几次 totaltrip。
而二分考虑的是,在可能的时间长度中(1,totaltrip*min(times))
,用二分找唯一解。
class Solution {
public:
bool check(long long int ans , vector<int>& time , int t){
int cnt = 0 ;
for(int i = 0 ; i < time.size() ; i ++){
cnt += ans / time[i] ;
if(cnt >= t) return true ;
}
return false ;
}
long long minimumTime(vector<int>& time, int t) {
int MaxAns = *min_element(time.begin() , time.end()) ;
long long int l = 1 , r = 1LL * MaxAns * t ;
while(l < r){
long long int mid = (l + r) >> 1 ;
if(check(mid, time, t)) r = mid ;
else l = mid + 1 ;
}
return l ;
}
};
可能的时间长度最大值是,每一次都要走最小的值,而且要走 t 次。这个最大值在一些用例时可能会超出实际的最大值,但是作为抽象的最大值应是最大中的最大。
看到一些大佬的代码里最大值直接取了 1e14。