您的位置:首页 > 编程语言 > Java开发

计算两个字符串间符合字典序且在一定长度内的字符串个数

2015-09-12 21:11 357 查看

计算两个字符串间符合字典序且在一定长度内的字符串个数

这几天为了准备笔试及面试,看了不少书籍,其中涉及到字符串处理及求值的问题有很多,私以为再碰到字符串相关的题怎么也不至于举足无措,然而马上被现实狠狠地打了一个耳光。

题目概述如下:编写一个函数,输入字符串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``")) {

4000
count = 0;
}
if (count % 20 == 0) {
System.out.println();
}
if (String.valueOf(a).equals("bcd")) {
System.out.println(count);
}
}
}
}
}
}
}


原题给的4个测试用例如下:
1、输入:"ab","ce",2
输出:56
2、输入:"a","z",4
输出:456974
3、输入:"a","b",1
输出:0
4、输入:"a","aaaa",4
输出:4(这里应该是2,本程序的答案也是2,因为前三个都是开区间,这里居然变成了闭区间)

本程序基本通过所有测试用例,程序修改多次破破烂烂,各位看官笑笑就好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 函数 编程