博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
庞果网 合法字符串
阅读量:5088 次
发布时间:2019-06-13

本文共 3437 字,大约阅读时间需要 11 分钟。

题目详情:

用n个不同的字符(编号1 - n),组成一个字符串,有如下2点要求:
    1、对于编号为i 的字符,如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符;
    2、对于编号为i的字符,如果2 * i <= n,则该字符不可以作为最后一个字符,且该字符后面所紧接着的下一个字符的编号一定要 >= 2 * i。
问有多少长度为M且符合条件的字符串。
例如:N = 2,M = 3。则abb, bab, bbb是符合条件的字符串,剩下的均为不符合条件的字符串。
输入:n,m  (2<=n,m<=1000000000);
输出:满足条件的字符串的个数,由于数据很大,输出该数Mod 10^9 + 7的结果。
函数头部
int validstring(int n,int m) {

}

代码如下:

 

import java.math.BigDecimal;import java.util.LinkedList;import java.util.Queue;public class Main {    public static int validstring(int n,int m) {        if (n > 2 || m > 1000000000){            System.err.println("‘n’或者‘m’超出范围了!");            return 0;        }        long count = countValid(n, m);        return BigDecimal.valueOf(count % (Math.pow(10, 9) + 7)).intValue();    }        //n个字符m位的全排列组合    private static long countValid(int n, int m) {        String v = "";        long s = 0;        char[] charArray = buildCharArray(n);        // 队列用来保存被访问节点的分支节点(邻接点)        Queue
que = new LinkedList
(); que.offer(v);// 起点入队列 while (!que.isEmpty()) { v = que.poll();// 弹出当前顶点 // 将当前节点的分支节(邻接)点加入到队列中 for (int i = 0; i < n; i++) { String u = v + charArray[i]; if (u.length() == m) {//m位,则校验是不是符合题目的要求 if (checkStr(u, charArray, 0)){ System.out.println(u); ++s; } } else{ que.add(u); // 邻接点入队 } } } return s; } //校验字符串是否符合规则 private static boolean checkStr(String str, char[] charArray, int j){ boolean returnFlag = false; int n = charArray.length; int m = str.length(); char c = str.charAt(j); Integer i = getCharArrayIndex(charArray, c); //如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符; if (2 * (i + 1) > n){ if (j == m - 1){ returnFlag = true; }else{ returnFlag = checkStr(str, charArray, j + 1); } }else{//如果2 * i <= n,则该字符不可以作为最后一个字符,且该字符后面所紧接着的下一个字符的编号一定要 >= 2 * i。 if (j == m - 1){ returnFlag = false; }else{ char d = str.charAt(j + 1); int ii = getCharArrayIndex(charArray, d); if (ii + 1 < 2 * (i + 1)){ returnFlag = false; }else{ returnFlag = checkStr(str, charArray, j + 1); } } } return returnFlag; } private static Integer getCharArrayIndex(char[] charArray, char c){ Integer returnIndex = null; for (int i = 0; i < charArray.length; i++){ char d = charArray[i]; if (d == c){ returnIndex = i; } } return returnIndex; } //产生1-n的随机字符 private static char[] buildCharArray(int n){ StringBuffer returnValue = new StringBuffer(); for (int i = 0; i < n; i++){ char c = 'a'; c = (char)(c + i); returnValue.append(c); } return returnValue.toString().toCharArray(); } //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 public static void main(String args[]) { System.out.println(validstring(2, 10) + " 次"); } //end //提示:自动阅卷结束唯一标识,请勿删除或增加。}

 

 

转载于:https://www.cnblogs.com/dyllove98/p/3230725.html

你可能感兴趣的文章
oracle连接的三个配置文件(转)
查看>>
Python内置函数(29)——help
查看>>
《梦断代码》读书笔记(三)
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
Mysql性能调优
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
getElement的几中属性介绍
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
list 容器 排序函数.xml
查看>>