字符串计数(动态规划)

2024-08-29 08:38
文章标签 动态 规划 字符串 计数

本文主要是介绍字符串计数(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。

输入描述:
每组数据包涵s1(长度小于100),s2(长度小于100),len1(小于100000),len2(大于len1,小于100000)

输出描述:
输出答案。

输入例子:
ab ce 1 2

输出例子:
56

刚看到这题的时候题目理解了半天,一开始理解错了字典序的意思,也是醉了,以为类似整数那样直接相减的算法(从右往左开始计算),后面才理解为字典序为(从左往右开始计算o(╯□╰)o),这个应该也是有点像动态规划的思想吧,先计算长度为len1然后计算len1+1、len1+2。。len2这样,记住每次的是26的(leni-1)次幂,类似于整数的高位数。详细的解题步骤如下:
首先要搞清楚字典序的意思:即从两个字符串的下标为0开始进行对比,字典序是从左往右进行对比的。
例如ab,abc这样两者之间的字符串个数为aba、abb,而ab、bb两者之间的字符串个数为:ac、ad、ae…az、ba这26个,所以高位的字符串个数要是26的i次幂。
其次,要理解题目的“长度在len1到len2的字符串的个数”,指的是长度在len1的字符串个数、长度在len1+1的字符串个数。。。长度为len2的字符串个数。
例abcde、acede这两个字符串,长度为1到4表示的是长度为1的时候两个字符a、a之间的个数,长度为2的时候两个字符ab、ac之间的个数,长度为3的时候abc、ace两个字符串之间的个数,长度为4:abcd、aced的个数。
所以计算的时候应该以长度作为变量遍历len1到len2之间的字符串个数,最后相加。

public static void main(String[] args) {// TODO Auto-generated method stubScanner scan = new Scanner(System.in);
//      String t[] = "a   b c".split(" ");
//      System.out.println((int)(0.6)+t.length);while(scan.hasNextLine()){String inputString[] = scan.nextLine().split(" ");System.out.println(getStrCount(inputString[0],inputString[1],Integer.parseInt(inputString[2]),Integer.parseInt(inputString[3])));//          System.out.println(scan.nextLine()+"@");}}/**** 求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。* @param str1 字符串s1* @param str2 字符串s2* @param len1 长度len1* @param len2 长度len1* @return 长度在len1到len2的字符串的个数,结果mod 1000007*/public static long getStrCount(String str1,String str2,int len1,int len2){
//      System.out.println(str1+" "+ str2+" "+len1+" "+len2);long sum = 0;char a[] = str1.toCharArray();char b[] = str2.toCharArray();int i = len1;for(i = len1; i <= len2; i++){//长度从len1 到len2,共有len2-len1种情况char a1 = a[0];char b1 = b[0];int t = b1 - a1;//两者的差值sum = sum + t * (long)Math.pow(26, i - 1);//先比较高位的差值,记得乘以26的i-1次幂long suma = 0,sumb = 0;//用于统计a[1]~a[i]的个数和b[1]~b[i]的个数,例a[1]-a[3] = abc 则每一位的个数分别为 123即a[1]-'a'-1=1,a[2]-'a'-1=2,a[3]-'a'-1=3int j = 1;int min = a.length > i ? i : a.length;for(j = 1; j < min; j++ ){t = a[j] - 'a' + 1;//算出其字典序的位置,所以是要剪掉'a'但还要加上一个1,例a的字典序为1,b的字典序为2suma = suma + t * (long)Math.pow(26, i - 1 - j);}min = b.length > i ? i : b.length;for(j = 1; j < min; j++ ){t = b[j] - 'a' + 1;sumb = sumb + t * (long)Math.pow(26, i - 1 - j);}sum = sum + sumb - suma;//sumb - suma 即剪掉a、b两个字符串从b[1]~b[i]的所有字符串的情况-a[1]~a[i]的所有字符串的情况即两者之间的字符串个数        }sum = sum - 1;//在计算最后一位的时候把字符串str2也包含进去了,所以要减去一个1,即题目给的例子计算ce的时候把ce计算进去了(b[1]-'a'+1的时候),所以要减掉一个1return sum % 1000007;}

小结:
理解题目含义是关键。

目前研究于Spark与Hadoop,群QQ号:521066396(spark,hadoop交流群),欢迎加入共同学习,一起进步~

这篇关于字符串计数(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117388

相关文章

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字