回文题(日期类,动态规划)

目录

1. 回文日期

2. 回文日期

3.判定回文串


第三题的动态规划是区间dp[],酌情看,以后可能会整理,可以自己查一下知识点

1. 回文日期

import java.util.Scanner;

public class lll {
    static int month[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    static boolean isrn(int y) {
        if(y%100!=0&&y%4==0||y%400==0) return true;
        return false;
    }
    static boolean check(int n) {
         int y=n/10000;
         int m=n/100%100;
         int d=n%100;
     if(m==0||m>12)return false;
        if(isrn(y)) {month[2]=29;}
        else {month[2]=28;}
        if(d==0||d>month[m])return false;
        
        
        return true;
    }
    
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
    int date1=in.nextInt();
    int date2=in.nextInt();
    //制作回文数字
    long sum=0;
    for(int i=0;i<10000;i++){
        int x1=i;//放前四位
        int x2=i;//放后四位
        for(int j=0;j<4;j++) {
            x1=x1*10+x2%10;
            x2/=10;
        }//i=9999  x1=x2=9999   
        //j:0 x1=99999  x2=999 1:x1=999999 x2=99 2:x1=9999999 x2=9 3:x1=99999999 x2=0;  
   if(x1>=date1&&x1<=date2&&check(x1)) {
       sum++;
   }
    }
        System.out.println(sum);
    }
}

2. 回文日期

//破系统,太垃圾了,同一段代码跑了5遍,前面一直超时,最后一次过了???
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static int x=0,y=0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int data = sc.nextInt();
        for (int i = data+1; i <= 99999999&&y==0; i++) {
            String str = i + "";
            int i1=(str.charAt(4)-'0')*10 + str.charAt(5)-'0',i2 = (str.charAt(6)-'0')*10 + str.charAt(7)-'0';
            if (i1 > 12 || i2 > 31 || i1 == 0 || i2 == 0)
                continue;
            char[] ch = str.toCharArray();
            huiwenriqi(ch);
        }
        sc.close();
    }
    public static void huiwenriqi(char[]ch) {
        char a = ch[0], b = ch[1], c = ch[2], d = ch[3],e = ch[4],f = ch[5],g = ch[6],h = ch[7];
        if(a==h&&b==g&&c==f&&d==e&&x==0) {
                System.out.println(ch);x=1;
            }
        if(a==c&&c==f&&f==h&&b==d&&d==e&&e==g) {
            System.out.println(ch);y=1;
        }

    }
}

3.判定回文串

import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改

public class mmm {
    
 public static void main(String[] args) {
     Scanner in = new Scanner(System.in);
   int n=in.nextInt();//字符串的长度
   int q=in.nextInt();//查询数
   String s=in.next();
   s=" "+s;//字符串索引从 11 开始
   int dp[][]=new int[n+10][n+10];
   int r=0;
   for(int i=1;i<=n;i++) {
       for(int j=1;j<=n;j++) {
           dp[i][j]=0;
       }
   }
   for(int i=1;i<=n;i++) {
       dp[i][i]=1;
   }
   for(int len=2;len<=n;len++) {
       for(int l=1;l+len-1<=n;l++) {
           r=l+len-1;
         //防止dp继续缩小至为负区间
           if(len==2&&s.charAt(l)==s.charAt(r)) {
               dp[l][r]=1;
               continue;
           }
           if(s.charAt(l)==s.charAt(r)) {//如果是回文
               dp[l][r]=dp[l+1][r-1];
           }
       }
   }
  
   while(q-->0) {
       int l1=in.nextInt();
       int r1=in.nextInt();
       if(dp[l1][r1]==1) {
           System.out.println("Yes");
       }else {
           System.out.println("No");
       }
   }
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值