文章目录
- 前言
- 一、检查替换后的词是否有效(力扣1003)
- 二、有效的括号(力扣20)【1003类似题目】
- 每日一题:数青蛙(力扣1419)
前言
1、检查替换后的词是否有效
2、有效的括号
3、数青蛙
一、检查替换后的词是否有效(力扣1003)
题目描述:
示例:
分析:
字符a:类似左括号,直接入栈。
字符b:如果栈为空,或者栈顶不为a,则返回false,否则将栈顶修改为b
字符c:如果栈为空,或者栈顶不为b,则返回false,否则弹出栈顶。
循环结束后如果栈为空,则返回true,否则返回false;
class Solution {
public boolean isValid(String s) {
char[] ss = s.toCharArray();
int i = 0;
for(char c:ss){
//栈顶元素不是a,但是此时栈为空
//或者栈顶元素不是a,此时栈不为空,那么需要判断当前元素与栈顶元素之间是否相差1
//如果相差1 那么就把栈顶元素拿出去 当前元素如果是<c 继续放入栈中
if(c>'a' &&(i==0|| c-ss[--i]!=1 )){
return false;
}
if(c<'c'){
ss[i++] = c;
}
}
return i==0;
}
}
二、有效的括号(力扣20)【1003类似题目】
题目描述
示例:
分析:
与上一题解法类似
class Solution {
public boolean isValid(String s) {
char[] ss = s.toCharArray();
char[] right = {')',']','}'};
char[] left = {'(','[','{'};
int i = 0;
for(char c: ss){
if(right[0]==c && (i==0||ss[--i]!=left[0]))
return false;
if(right[1]==c && (i==0||ss[--i]!=left[1]))
return false;
if(right[2]==c && (i==0||ss[--i]!=left[2]))
return false;
for(char l:left){
if(c==l){
ss[i++] = c;
}
}
}
return i==0;
}
}
每日一题:数青蛙(力扣1419)
题目描述:
示例:
分析:
croak
遍历给定的字符串:
如果当前字符是c,那么需要判断k是否在之前出现过,如果出现过,可以继续用这一只青蛙chars[c]++,chars[k]--
,如果没有出现过则新开一只青蛙chars[c]++
;
如果当前字符是r,那么需要判断c是否在之前出现过,如果出现过,可以继续用这一只青蛙chars[r]++,chars[c]--
,如果没有出现过则不符合题目要求 直接return false;
同理 o a k 一样
最后一定要注意类似ccccccrrooaakk
这种情况
需要多加一个条件
if (chars['c'-'a'] > 0 || chars['r'-'a'] > 0 || chars['o'-'a'] > 0 || chars['a'-'a'] > 0)
return -1; // 有发出其它声音的青蛙,不符合要求
class Solution {
public int minNumberOfFrogs(String croakOfFrogs) {
char[] chars = new char[26];
char[] target = croakOfFrogs.toCharArray();
for(int i=0;i<target.length;i++){
if(target[i]=='c'){
//先去看看有没有出现过k
if(chars['k'-'a']==0){
//之前没有出现过青蛙
chars['c'-'a']++;
}else{
//复用青蛙
chars['c'-'a']++;
chars['k'-'a']--;
}
}else if(target[i]=='r'){
//先去看看有没有出现过c
if(chars['c'-'a']==0){
//之前没有出现过c
return -1;
}else{
chars['r'-'a']++;
chars['c'-'a']--;
}
}else if(target[i]=='o'){
//先去看看有没有出现过r
if(chars['r'-'a']==0){
//之前没有出现过r
return -1;
}else{
chars['o'-'a']++;
chars['r'-'a']--;
}
}else if(target[i]=='a'){
//先去看看有没有出现过o
if(chars['o'-'a']==0){
//之前没有出现过o
return -1;
}else{
chars['a'-'a']++;
chars['o'-'a']--;
}
}else if(target[i]=='k'){
//先去看看有没有出现过a
if(chars['a'-'a']==0){
//之前没有出现过a
return -1;
}else{
chars['k'-'a']++;
chars['a'-'a']--;
}
}else{
return -1;
}
}
if (chars['c'-'a'] > 0 || chars['r'-'a'] > 0 || chars['o'-'a'] > 0 || chars['a'-'a'] > 0)
return -1; // 有发出其它声音的青蛙,不符合要求
return chars['k'-'a']==0?-1:chars['k'-'a'];
}
}
解法二:
class Solution {
public int minNumberOfFrogs(String croakOfFrogs) {
int res = 0;
char[] cnt = new char[256];
char[] target = croakOfFrogs.toCharArray();
for(char c:target){
cnt[c]++;
int cnt1 = cnt['c']-cnt['r'];
int cnt2 = cnt['r']-cnt['o'];
int cnt3 = cnt['o']-cnt['a'];
int cnt4 = cnt['a']-cnt['k'];
if(cnt1<0 || cnt2<0 || cnt3<0 || cnt4<0){
return -1;
}
if(c=='c'){
res = cnt['c']-cnt['k']>res?cnt['c']-cnt['k']:res;
}
}
if(cnt['c']!=cnt['r'] || cnt['c']!=cnt['o'] || cnt['c']!=cnt['a'] || cnt['c']!=cnt['k']){
return -1;
}
return res;
}
}