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

avatar
作者
筋斗云
阅读量:0

目录

牛客.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);         }             } }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!