准备笔试第20天,牛客.mari和shiny牛客.对称之美牛客.最小公倍数牛客.非对称之美

目录

牛客.mari和shiny

牛客.对称之美

牛客.最小公倍数

牛客.非对称之美


牛客.mari和shiny

1.状态转移方程

s[i]:表示字符串str中[0,i]区间内,有多少个s。

h[i]:字符串str中[0,i]区间内,有多少个sh。

y[i]:字符串str[0,i]区间内,有多少个shy。

2.状态转移方程

(0-i-1)区间

s[i]

h[i]

y[i]

import java.util.*;
public class Main{
    //多状态dp
      public static void main(String[] args)  {
      Scanner in=new Scanner(System.in);
            int n=in.nextInt();
            in.nextLine();
            String a=in.nextLine();
            char[]str=a.toCharArray();
           long[]s=new long[n+1];
            long[]h=new long[n+1];
            long[]y=new long[n+1];
            //初始化,看他是s,就初始化为1
            for(int i=1;i<=str.length;i++){
                if(str[i-1]=='s'){
                    s[i]=s[i-1]+1;
                    h[i]=h[i-1];
                    y[i]=y[i-1];
                }else if(str[i-1]=='h'){
                    s[i]=s[i-1];
//假如第一个是h,但是前面没有s,所以h还是为0
                    h[i]=s[i-1]+h[i-1];
                    y[i]=y[i-1];
                }else if(str[i-1]=='y'){
                    s[i]=s[i-1];
                    h[i]=h[i-1];
                    y[i]=h[i-1]+y[i-1];
                }else{
                    s[i]=s[i-1];
                    h[i]=h[i-1];
                    y[i]=y[i-1];
                }
            }
            System.out.print(y[n]);
    }
}

牛客.对称之美

import java.util.*;
public class Main{ 
   public static boolean check(boolean[][]hash,int left,int right){
        for(int i=0;i<26;i++){
            if(hash[left][i]&&hash[right][i]){
                return true;
            }
        }
            return false;
         
    }
public static void main(String[] args)
{
       Scanner in=new Scanner(System.in);
        int t = in.nextInt();
        for(int i=0;i<t;i++){
         int n=in.nextInt();
        //表示第n组使用hash标记26
         boolean[][]hash=new boolean[n][26];
        for(int j=0;j<n;j++){
         String a=in.next();
         char[]m=a.toCharArray();
        for(int k=0;k<m.length;k++)
//使用hash存储,然后设置为boolean即可
         hash[j][m[k]-'a']=true;              
        }    
        int right=n-1;
        int left=0;
          while(left<right){
              //检查是否有重复的字符
              if(!check(hash,left,right))break;
              left++;
              right--;
          }
            if(left<right){
                System.out.println("No");
            }else{
                System.out.println("Yes");
            }
            
    }
        
  

  
  }
}

牛客.最小公倍数

 public static int gcd(int a,int b){
        if(b==0)return a;
        return gcd(b,a%b);
    }

牛客.非对称之美

回文串(一般解法,中心扩展算法,dp,动态窗口等等)

找规律,贪心

如果本身就不是回文串,那么直接返回全部

假如本身是一个字符串,他其实是关于中心对称的,那么只要为对左边或者右边对应的删除一个,就是非回文,

换句话说,我们只需要看一个字符串是不是回文,

除非你是aaaaaa这种,所有这种字符串都相同的时候,这种没有非回文串,只需要返回0。

import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner in=new Scanner(System.in);
        String aa=in.nextLine();
        char[]a=aa.toCharArray();
        //首先先检查他是不是回文串
        int left=0;
        int right=a.length-1;
        while(left<right&&a[left]==a[right]){
            left++;
            right--;
        }
      int  ret=0;
        for(int i=1;i<a.length;i++){
            if(a[i]!=a[i-1]){
                ret=1;
            }
        }
        if(ret==0){
            System.out.print(0);
        }
        else if(left>=right)
        {
            System.out.print(a.length-1);
        }else{
            System.out.print(a.length);
        }        
    }
}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值