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

来源:互联网 发布: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