计算两个字符串间符合字典序且在一定长度内的字符串个数
来源:互联网 发布:des算法加密过程 编辑:程序博客网 时间:2024/05/20 16:10
计算两个字符串间符合字典序且在一定长度内的字符串个数
这几天为了准备笔试及面试,看了不少书籍,其中涉及到字符串处理及求值的问题有很多,私以为再碰到字符串相关的题怎么也不至于举足无措,然而马上被现实狠狠地打了一个耳光。
题目概述如下:编写一个函数,输入字符串s1,s2,长度len,返回s1至s2之间符合字典序的长度不大于len的所有字符串的个数。乍一看,这题目很简单呐,直接一个for (int i = 0; i < len; i++)循环就搞定了嘛。但是细思之下方恐极,字典序并不像普通的进制转换那样简单。这里就不哔哔具体的心路历程了。直接上代码:
public class Solution { // 计算两个字符串间一定长度内的字典字符串个数,暂全当开区间处理 public static int distance(String s1, String s2, int len) { int len1 = s1.length(); int len2 = s2.length(); // 补齐s1,s2使其长度等于len,所补字符ASCII值为96,一开始的想法是利用之,后来发现不是很好利用,可以替换为别的字符 for (int i = 0; i < len - len1; i++) { s1 += "`"; } for (int i = 0; i < len - len2; i++) { s2 += "`"; } // 小递归,可有可无 if (s1.charAt(0) == s2.charAt(0) && len > 1) { return distance(s1.substring(1), s2.substring(1), len - 1); } if (s1.charAt(0) == s2.charAt(0) && len == 1) { return 0; } // 转为字符数组 char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); // 计数初始化 int count = 0; // 将所补字符替换为'a',同时加减count,至于不在上面直接替换为'a',为了下面的循环更通用 int off1 = len - 1; while (off1 >= 0 && c1[off1] == '`') { c1[off1] = 'a'; count++; off1--; } int off2 = len - 1; while (off2 >= 0 && c2[off2] == '`') { c2[off2] = 'a'; count--; off2--; } // 计算中间完整的部分 int dis = 0; dis = c2[0] - c1[0] - 1; for (int i = 0; i < len; i++) { int b = (int) Math.pow(26, i); count += dis * b; } // 计算两端的部分 // 替换之后,还会有c1[0]=c2[0]的情况,会使count值在上面的循环变负,但会在下面的循环中加回来 int temp1 = 0; int temp2 = 1; for (int j = 1; j < len; j++) { temp1 = temp1 * 26 + 122 - c1[j]; temp2 = (temp2 - 1) * 26 + c2[j] - 96; count += temp1; count += temp2; } return count; } public static void main(String[] args) { String s1 = "a"; String s2 = "aaaa"; System.out.println(distance(s1, s2, 4)); // put(); } // 为了验证上面的结果,编写了一个生成长度不大于3的字典字符串函数 public static void put() { char[] a = new char[3]; int count = 0; for (int k = 97; k < 123; k++) { a[0] = (char) k; for (int l = 96; l < 123; l++) { a[1] = (char) l; for (int m = 96; m < 123; m++) { a[2] = (char) m; if (!(a[1] == '`' && a[2] != '`')) { System.out.print(String.valueOf(a) + " "); count++; if (String.valueOf(a).equals("a``")) { count = 0; } if (count % 20 == 0) { System.out.println(); } if (String.valueOf(a).equals("bcd")) { System.out.println(count); } } } } } }}
原题给的4个测试用例如下:1、输入:"ab","ce",2输出:562、输入:"a","z",4输出:456974 3、输入:"a","b",1输出:04、输入:"a","aaaa",4输出:4(这里应该是2,本程序的答案也是2,因为前三个都是开区间,这里居然变成了闭区间)本程序基本通过所有测试用例,程序修改多次破破烂烂,各位看官笑笑就好。
0 0
- 计算两个字符串间符合字典序且在一定长度内的字符串个数
- 计算字符串的长度
- 计算字符串的长度
- 计算字符串的长度
- 计算字符串的长度
- 求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。
- 将字符串尽量平均分成两个同长度的子字符串,且不受中文字影响
- PHP截取一定长度字符串的函数
- 一种格式化一定长度字符串的方法
- JSTL中截取一定长度的字符串
- 获取一定长度的随机字符串 RandomStringGenerator
- JSTL中截取一定长度的字符串长度,如果超过指定长度在未尾加“......”,否则返回原来字符串。
- POJ 3415 求两个字符串间长度不小于k的公共子串的个数
- PHP:计算字符串中汉字的个数、正确计算字符串的长度
- 计算特定字符串的在一个字符串中的个数
- 计算一段字符串的长度(中文算两个字符)
- 两个截取字符串的实用方法(超过一定长度自动换行)
- C#计算字符串长度(中文两个字符)
- java中string与其他类型数据之类的转换
- USACO 1.3 Barn Repair (快排+贪心)
- [BZOJ1617] [Usaco2008 Mar]River Crossing渡河问题
- 硬盘和操作系统数据块
- KE Keil工程每次编译都编译所有文件
- 计算两个字符串间符合字典序且在一定长度内的字符串个数
- CERC 2012 题解 (A~K)
- IOS上 关于状态栏的相关设置(UIStatusBar)
- hdoj 2404 Permutation Recovery【基础题】
- python对字符串实现四则运算
- iOS 多语言本地化 完美解决方案【自动+手动】
- JavaServlet服务端与客户端简单交互
- Linux学习之进程fork()、exec、exit()/_exit()、wait()/waitpid
- 登陆