7月算法训练------第二天(字符串)解题报告
题目类型:字符串
题目难度:简单
第一题、2315. 统计星号
题目链接:2315. 统计星号
思路分析:
用一个字符数组存储字符串s
,定义一个布尔变量flag
,主要用于判断当前字符是否在两个|
之间。如果在两者之间则不计数,如果不在两个|
之间,若满足c[i]==*
,则使sum++
。
返回最终的sum
。
代码:
class Solution {
public int countAsterisks(String s) {
char[] c = new char[s.length()];
for(int i = 0; i < c.length; i++){
c[i] = s.charAt(i);
}
boolean flag = false;
int sum = 0;
for(int i = 0; i < c.length; i++){
if(c[i] == '|' && !flag){ //第一个|出现,将flag至true
flag = true;
}else{
if(c[i] == '|' && flag){ //成对的|出现,将flag置false;
flag = false;
}
}
if(!flag){
if(c[i] == '*'){
sum++;
}
}
}
return sum;
}
}
第二题、459. 重复的子字符串
题目链接:459. 重复的子字符串
思路分析:
运用Java自身的字符串匹配算法
代码:
class Solution {
public boolean repeatedSubstringPattern(String s) {
return (s + s).indexOf(s, 1) != s.length();
}
}
第三题、1790. 仅执行一次字符串交换能否使两个字符串相等
题目链接:1790. 仅执行一次字符串交换能否使两个字符串相等
思路分析:
第一版:
遍历两个字符串,如果字符串中有两个字符不相同,就返回true
;
如果不是两个字符不同,就返回false
;
错误:两个字符串相等时也要返回true
;
第二版:
当两个字符串完全相等时,也要返回true
(即两个字符串中的不相同字符为0个);
错误原因:
"caa"
"aaz"
预期结果:false;
返回结果:true;
第三版:
在判断有两个字符不相等时,同时要判断这两个字符交换后是否相同,这时就需要有两个变量,记录不相同字符的索引:first
和second
。
当有两个字符不相等时如果c1[first] == c2[second] && c2[first] == c1[second]
那么就返回true
代码:
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
int count = 0, first = 0, second = 0;
char[] c1 = new char[s1.length()];
char[] c2 = new char[s2.length()];
for(int i = 0; i < c1.length; i++){
c1[i] = s1.charAt(i);
c2[i] = s2.charAt(i);
}
for(int i = 0; i < c1.length; i++){
if(c1[i] != c2[i] && first == 0){
count++;
first = i;
}else if(c1[i] != c2[i] && first != 0){
count++;
second = i;
}
}
if(count == 2 || count == 0){
if(c1[first] == c2[second] && c2[first] == c1[second]){
return true;
}
}
return false;
}
}
第四题、1961. 检查字符串是否为数组前缀
题目链接:1961. 检查字符串是否为数组前缀
思路分析:
用一个StringBuilder
存储words
中的字符串,如果StringBuilder
的长度小于s
的长度,则继续向StringBuilder
加入字符串;当存储到StringBuilder
的长度和s
的长度相等时,就结束存储;
然后判断一下StringBuilder
的长度和s的长度是否相等,这一步的目的是为了防止出现words
中的字符串全都存储在StringBuilder
中,即StringBuilder.length() > s.length()
;
最后按顺序遍历StringBuilder
和s
,如果有不同,则返回false
;如果都相同则返回true
。
代码:
class Solution {
public boolean isPrefixString(String s, String[] words) {
StringBuilder strb = new StringBuilder();
for(int i = 0; i < words.length; i++){
if(strb.length() < s.length()){
strb.append(words[i]);
}
if(strb.length() == s.length()){
break;
}
}
if(s.length() != strb.length()){
return false;
}
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) != strb.charAt(i)){
return false;
}
}
return true;
}
}