目录
只写了两道题就不想写了......
第一道题
给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。
如果存在这样的子字符串,返回 true;如果不存在,返回 false 。
示例 1:
输入:s = "leetcode"
输出:true
解释:子字符串 "ee" 的长度为 2,它也出现在 reverse(s) == "edocteel" 中。
示例 2:
输入:s = "abcba"
输出:true
解释:所有长度为 2 的子字符串 "ab"、"bc"、"cb"、"ba" 也都出现在 reverse(s) == "abcba" 中。
示例 3:
输入:s = "abcd"
输出:false
解释:字符串 s 中不存在满足「在其反转后的字符串中也出现」且长度为 2 的子字符串。
提示:
1 <= s.length <= 100
字符串 s 仅由小写英文字母组成。
我用的暴力解法,直接利用StringBuffer进行反转,遍历比对是否存在
class Solution {
public static boolean isSubstringPresent(String s) {
StringBuffer s1=new StringBuffer(s);
String s2= String.valueOf(s1.reverse());
for(int i=0;i<s.length()-1;i++){
String c1= String.valueOf(s.charAt(i)),c2= String.valueOf(s.charAt(i+1));
String s3= c1+c2;
if(s2.contains(s3)){
return true;
}
}
return false;
}
}
大佬的题解:
用一个 26×26的布尔数组进行记录。
class Solution {
public boolean isSubstringPresent(String S) {
char[] s = S.toCharArray();
boolean[][] vis = new boolean[26][26];
for (int i = 1; i < s.length; i++) {
int x = s[i - 1] - 'a';
int y = s[i] - 'a';
vis[x][y] = true;
if (vis[y][x]) {
return true;
}
}
return false;
}
}
第二题
给你一个字符串 s 和一个字符 c 。返回在字符串 s 中并且以 c 字符开头和结尾的
非空子字符串
的总数。
示例 1:
输入:s = "abada", c = "a"
输出:6
解释:以 "a" 开头和结尾的子字符串有: "abada"、"abada"、"abada"、"abada"、"abada"、"abada"。
示例 2:
输入:s = "zzz", c = "z"
输出:6
解释:字符串 s 中总共有 6 个子字符串,并且它们都以 "z" 开头和结尾。
提示:
1 <= s.length <= 105
s 和 c 均由小写英文字母组成。
嗯......代码当时是在idea上写的,提交代码的时候没有细心改一些东西,再加上第一次参加力扣周赛,我以为提交错误一次会加时,是限制的五分钟内不能再提交,我在第一次提交错误的时候有点蒙,然后又提交了几次,看看会不会被限制提交,没想到居然提交了......最后是看了自己的比赛用时才明白啥意思,代码的一些小细节也改了......通过了......服了......粗心.......直接掉了一千多个名次......
感觉我的答案也好LOW......
class Solution {
public static long countSubstrings(String s, char c) {
if(s.length()==1 && s.equals(String.valueOf(c)))return 1;
if(s.length()==1&&!s.equals(String.valueOf(c)))return 0;
long count=0,aa=0;
for(int i=0;i<s.length();i++){
char c1=s.charAt(i);
if(c1==c){
aa++;
}
}
count=aa*(aa-1)/2;
return count+aa;
}
}
解题思路:
1 | 1 | 0 |
2 | 3 | 1 |
3 | 6 | 3 |
4 | 10 | 6 |
5 | 15 | 10 |
... | ... | ... |
以某个字符开头和结尾的子字符串数量=字符串中字符的数量+字符两两匹配的数量
当字符串中某个字符的数量等于1的时候,答案就是1,当大于1的时候,是按照
这个规律递增的,因为是从2开始的,所以当某个字符的数量大于1的时候,就是按照n*(n-1)/2进行递增的,所以在代码中就需要先判断字符串长度等于1的情况,之后再找出某个字符在字符串中出现的次数,代入这个公式即可。
大佬的题解:
class Solution {
public long countSubstrings(String s, char c) {
long k = s.chars().filter(ch -> ch == c).count();
return k * (k + 1) / 2;
}
}
啊!!!公式不用分大于1和小于1!!!也不用再加上自身的数量!!!!!啊啊啊!!!
那我还想这么多干嘛!!!画蛇添足了啊喂!!!
第三题
给你一个字符串 word 和一个整数 k。
如果 |freq(word[i]) - freq(word[j])| <= k 对于字符串中所有下标 i 和 j 都成立,则认为 word 是 k 特殊字符串。
此处,freq(x) 表示字符 x 在 word 中的
出现频率
,而 |y| 表示 y 的绝对值。
返回使 word 成为 k 特殊字符串 需要删除的字符的最小数量。
示例 1:
输入:word = "aabcaba", k = 0
输出:3
解释:可以删除 2 个 "a" 和 1 个 "c" 使 word 成为 0 特殊字符串。word 变为 "baba",此时 freq('a') == freq('b') == 2。
示例 2:
输入:word = "dabdcbdcdcd", k = 2
输出:2
解释:可以删除 1 个 "a" 和 1 个 "d" 使 word 成为 2 特殊字符串。word 变为 "bdcbdcdcd",此时 freq('b') == 2,freq('c') == 3,freq('d') == 4。
示例 3:
输入:word = "aaabaaa", k = 2
输出:1
解释:可以删除 1 个 "b" 使 word 成为 2特殊字符串。因此,word 变为 "aaaaaa",此时每个字母的频率都是 6。
提示:
1 <= word.length <= 105
0 <= k <= 105
word 仅由小写英文字母组成。
这是我的题解,就过了这么多案例:
class Solution {
public static int minimumDeletions(String word, int k) {
List<Long>list=new ArrayList<>();
HashSet<Character>set=new HashSet<>();
for(int i=0;i<word.length();i++){
char c=word.charAt(i);
if(set.contains(c)){
continue;
}else{
list.add(countCharacters(word,c));
set.add(c);
}
}
int count=0;
Collections.sort(list);
while(list.get(list.size()-1)-list.get(0)>k){
count+=list.get(list.size()-1)-list.get(0)-k;
list.set(list.size()-1,list.get(0)+k);
Collections.sort(list);
}
return count;
}
public static long countCharacters(String str, char target) {
return str.chars().filter(ch -> ch == target).count();
}
}
大佬的题解:
class Solution {
public int minimumDeletions(String word, int k) {
int[] cnt = new int[26];
for (char c : word.toCharArray()) {
cnt[c - 'a']++;
}
Arrays.sort(cnt);
int maxSave = 0;
for (int i = 0; i < 26; i++) {
int sum = 0;
for (int j = i; j < 26; j++) {
sum += Math.min(cnt[j], cnt[i] + k);
}
maxSave = Math.max(maxSave, sum);
}
return word.length() - maxSave;
}
}
至于最后一题的困难题,笑死,我还看个毛线!
周赛链接:竞赛 - 力扣 (LeetCode)
近日总结:不想说话......心累......每天起床特别难受,特别费力......