【问题标题】:Tricky Java problem to split and manipulate String拆分和操作字符串的棘手 Java 问题
【发布时间】:2020-07-02 20:51:25
【问题描述】:

我需要在 Java translate_string() 中创建一个函数, 它正在逐个字母地“翻译”字符串。 函数以String为参数,返回String[]数组:

public static String[] translate_string(String string) 

给定现有函数 translate_letter(), 它将 String 作为 arg 并返回 String[]

的数组
public static String[] translate_letter(String letter) 

它翻译每个字母,我需要按顺序翻译 将整个字符串逐个字母组合成输出字符串。 复杂性是,一个字符可以翻译成多个 字符集,不是一一对应的关系 输入字符串和输出字符串,是-一对多的关系, 其中一个字母作为输入可以产生多种组合 (即数组)作为输出。

注意:术语翻译与实际翻译无关 一种语言到另一种语言,只是替换一个字符 设置其他字符。

以下是函数的确切代码 id 简化版本 translate_letter()(无需修改):

//------------------------------------------------------------
// translate letters - return array of diff combinations
public static String[] translate_letter(String s) {

    ArrayList<String> o = new ArrayList<>(1);

    if ( s.equals("a") ) { // if a 
        o.add("a1");
    } else {

        if ( s.equals("b") ) { // if b
            o.add("b1"); o.add("b2");
        } else {

            if ( s.equals("c") ) { // if c 
                o.add("c1"); o.add("c2"); o.add("c3");
            } else {

                if ( s.equals("d") ) { // if d 
                    o.add("d1"); o.add("d2"); o.add("d3"); o.add("d4");
                } else {

                    o.add(s); // s = def add (if nothing above matches)

                } // end if d 

            } // end if c

        } // end if b

    } // end if a

    //Convert ArrayList o to string array[]
    String[] array = o.toArray(new String[o.size()]);

    return array;

} // end translate_letter()
//------------------------------------------------------------

那么,如何翻译字符串呢? 让我们看一下 translate 的简单版本 - 当 translate_letter() 只返回字符串。 所以,字母“a”将被翻译成“a1”,字母“b” 将被翻译成“b1”,“c” - 到“c1”。 输入字符串“a”将被翻译为“a1”,简单。 输入字符串“ab”将被翻译为“a1b1”,简单。 输入字符串“abc”将被翻译为“a1b1c1”,简单。 我不需要创建这个简单的版本——这里没什么可做的, 只需拆分输入字符串并逐个字母翻译。

我想写的(我不能这样做)- 是 translate_string() 的复杂版本, 当函数 translate_letter() 返回多个组合时, 即 - 输出组合数组。

例如(根据上面 translate_letter() 的代码, 字母“a”将被翻译成“a1”,简单。 但是字母“b”会被 translate_letter() 翻译成 2 种组合: “b1”和“b2”, 输出是 String[] array = {"b1", "b2" }

因此,字符串“a”将被 translate_string() 转换为 只有 1 个元素 R[] = { "a1" }

String "ab" will be translated as array of 2 elements 
R[] = { "a1b1", "a1b2" }

String "abc" will be translated as: 
R[] = { "a1b1c1", "a1b1c2", "a1b1c3", "a1b2c1", "a1b2c2", "a1b2c3" }

String "db" will be translated as: 
R[] = { "d1b1", "d2b1", "d3b1", "d4b1", "d1b2", "d2b2", "d3b2", "d4b2" }

这个任务比最初看起来更复杂 看它。我尝试了两种方法但失败了 - 简单的数组 [] 和 ArrayList 的 Array[] - 不能循环遍历两个数组(具有不同的 索引)并需要一些外部帮助或想法 - 如何完成此操作。

【问题讨论】:

  • 而不是 IF-Else ..尝试使用 IF- ELSE IF - ELSE IF - ELSE .. 代码会更干净
  • 不应该把db变成{ "d1b1", "d2b1", "d3b1", "d4b1", "d1b2", "d2b2", "d3b2", "d4b2" }吗?
  • 我无法从您的问题描述中判断一个字母是因为它在字符串中的位置而重复,还是因为它在字母表中的位置而重复?

标签: java arrays string arraylist


【解决方案1】:

您需要一个递归的translateString 方法(根据Java 命名约定以驼峰式命名,名称中没有任何下划线)。算法是:

  1. 如果string 是空字符串,则返回一个包含一个元素的数组,即空字符串。
  2. translateLetter()获取第一个字母的所有可能翻译。
  3. 通过对translateString() 的递归调用,获取第一个字母之后字符串剩余部分的所有可能翻译。或者对于快捷方式:只需调用translateString(),将第一个字符之后的字符串部分作为参数传递。
  4. 在两个嵌套循环中,将第一个字母的每个可能的翻译与字符串其余部分的每个可能的翻译连接起来。其中一个循环将遍历从上面 2. 获得的第一个字母的可能翻译。另一个循环遍历从 3 中获得的字符串剩余部分的可能翻译。将连接的字符串添加到 ArrayList&lt;String&gt;
  5. 将列表转换为数组并返回。

【讨论】:

  • 3.递归调用 - 调用什么以及如何调用?说起来容易,做起来难。 4. 为什么是 2 个嵌套循环?如何获得每个可能翻译的字符串提醒?在没有提供任何代码的情况下,这是非常有趣(但不正确)的任务规范,因此 - 对我来说没用,抱歉
  • Stack Overflow 不是编码服务。我已经编辑并添加了更多信息。
【解决方案2】:

这是我很少会回答作业的情况之一,尽管 Ole V.V.是对的。 做作业的时候,学习效果是相对的,对于苦苦挣扎的人来说,是不诚实的。

public static String[] translate_string(String s) {
    Set<String> translations = new HashSet<>();
    if (!s.isEmpty()) {
        s.codePoints(cp -> {
            String letter = new String(new int[] {cp}, 0, 1);
            String[] more = translate_letter(letter);
            if (more.length == 0) {
            } else if (more.length == 1) {
                translations.add(more[0]);
            } else {
                Set<String> prior_translations = new HashSet<>(translations);
                translations.clear();
                for (String prior: prior_translations) {
                    for (String letter: letter_translations) {
                        translations.add(prior + letter);
                    }
                }
            }
        });
    }
    return translations.toArray(new String[0]);
}

诀窍是:当有 N 个翻译并获得下一个字母 L 个字母翻译时,结果是 N×L 个翻译。

Ole V.V. 的回答更好地解释事情。

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多