当前位置: 首页 > 面试题库 >

C ++ / C / Java:Anagrams-从原始字符串到目标;

池庆
2023-03-14
问题内容

我正在尝试解决此问题:http :
//uva.onlinejudge.org/external/7/732.html。对于给定的示例,他们给我们提供了原始单词,例如
TRIT 和目标“组合”字符串 TIRT

目标: 我们必须输出所有有效的序列“ i”和“ o”(分别为推式和弹出式),这些序列从源字符串产生目标字符串。

因此,我正在考虑计算“ i”和“ o”的所有排列,但是减少了这种情况:

1) 如果当前排列以“ o”开头,则停止检查,因为所有下一个排列都将从此pop命令开始,并且从空堆栈中弹出内容是无效命令。

2) 如果在检查过程中发现一个’o’命令,并且堆栈中没有任何内容,请跳过这种情况。

3) 如果找到“ i”命令,但输入字符串中没有任何内容,请跳过这种情况。

4) 如果找到一个’o’命令并且当前期望的字符不是刚刚弹出的字符,则跳过该情况,因为这将永远不会到达目标字符串。

5) 不要搜索输入字符串和目标字符串的长度是否不同。

但我认为无论如何我可能都会获得我的称号…

我知道这个理论:排列也许一直在回溯。我只是很难实现它。

有人可以和我分享一些代码或想法吗?

PS:当然,任何可能减少执行时间的建议都会受到欢迎。


问题答案:

此第一个迭代解决方案具有指导意义。这不是最有效的方法,因为它在String所有地方都可以使用,但这是一个很好的起点。

import java.util.*;

public class StackAnagram {

    static void anagram(String s1, String s2, String stack, String instr) {
        if (s2.isEmpty()) {
            if (s1.isEmpty() && stack.isEmpty()) {
                System.out.println(instr.trim());
            }
            return;
        }
        if (!s1.isEmpty()) {
            anagram(s1.substring(1), s2, s1.charAt(0) + stack, instr + "i ");
        }
        if (!stack.isEmpty() && stack.charAt(0) == s2.charAt(0)) {
            anagram(s1, s2.substring(1), stack.substring(1), instr + "o ");
        }
    }

    static void anagram(String s1, String s2) {
        System.out.println("[");
        anagram(s1, s2, "", "");
        System.out.println("]");
    }

    public static void main(String args[]) {
        anagram("madam", "adamm");
        anagram("bahama", "bahama");
        anagram("long", "short");
        anagram("eric", "rice");
        anagram("ericc", "rice");
    }
}


 类似资料:
  • 我必须将java“转换”为c。我做得对吗?你能纠正吗 爪哇-

  • 主要内容:转换为C风格的字符串,string 字符串的输入输出,访问字符串中的字符,字符串的拼接,string 字符串的增删改查C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串 指针。 string 是 C++ 中常用的一个类,它非常重要,我们有必要在此单独讲解一下。 使用 string 类需要包含头文件 ,下面的例子介绍了几种定义 string 变量(对象)的方法:

  • 主要内容:1、声明和初始化字符串,2、String 类中的属性,3、String 类中的方法在 C# 中,string(或 String)关键字是 System.String 类的别名,其中提供了定义字符串以及操作字符串的一系列方法,下面就来详细介绍一下。 1、声明和初始化字符串 您可以使用以下方式来创建字符串 为 String 类型的变量赋值一个字符串; 使用 String 类的构造函数; 使用字符串串联运算符; 通过检索属性或调用返回字符串的方法; 通过调用格式化方法将值或对象转换为

  • C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 我必须将java“转换”为c。我做得对吗?你能纠正吗 爪哇-