给定一个字符串,找到元音和辅音数量相同的最长子串?

2024-02-19

给定一个字符串,找到元音和辅音数量相同的最长子串。

澄清:我不确定我们是否可以生成一个新字符串,或者子字符串必须是原始字符串的一部分?到目前为止我有这个,

代码片段:

    Scanner scanner = new Scanner(System.in);
    String string = new String(scanner.next());
    int lengthOfString = string.length();
    int vowelCount = 0;
    int consCount = 0;

    for (int i = 0; i < lengthOfString; i++) {
        if (string.charAt(i) == 'u' || string.charAt(i) == 'e'  || string.charAt(i) == 'i'
                || string.charAt(i) == 'o' || string.charAt(i) == 'a' ) {
            vowelCount++;


        } else {

            consCount++;
        }

    }

    System.out.println(vowelCount);

EDIT我的计数工作正常,但如何创建子字符串?


这可以解决O(n) 时间和空间使用由以下方法计算的“净”值这个答案 https://stackoverflow.com/a/39607701/47984结合以下观察:

  • 子串 s[i .. j] 具有相同数量的辅音和元音当且仅当 net[1 .. i-1] = net[1 .. j],其中 net[i .. j] 是总和位置 i 和 j(含)之间每个字符的“净”值(元音为 1,辅音为 -1)。

要看到这一点,请观察告诉我们子字符串 s[i .. j] 是我们正在寻找的类型的条件是:

net[i .. j] = 0.

将 net[1 .. i-1] 添加到该方程的两边得到

net[1 .. i-1] + net[i .. j] = net[1 .. i-1]

与 LHS 然后简化为

net[1 .. j] = net[1 .. i-1]

算法

这意味着我们可以为计算净值的运行总和时获得的每个可能的不同值创建一个包含两个条目(看到的第一个位置和看到的最后一个位置)的表。这个运行总数的范围可以低至 -n (如果每个字符都是辅音)或高至 n (如果每个字符都是元音),因此总共最多有 2n+1 个不同的此类总和,所以我们我们的表中需要那么多行。然后,我们从左到右遍历字符串,计算运行总计净值,并更新表中与当前运行总计相对应的对,并注意此更新何时产生新的最大长度子字符串。在伪代码中,使用从零开始的数组索引并使用单独的数组来保存每对中的元素:

  1. 创建 2 个长度为 2n+1 的数组,first[] 和 last[],最初包含所有 -2,除了 first[n] 为 -1。 (需要使用 -2 作为哨兵,因为 -1 实际上是一个有效值!)
  2. 设置 bestFirst = bestLast = bestLen = -1。
  3. 设置运行总计 t = n。 (n“意味着”0;使用此偏差仅意味着我们可以直接使用运行总计作为数组的非负值索引,而无需重复向其添加偏移量。)
  4. For i from 0 to n-1:
    • 如果 s[i] 是元音,则递增 t,否则递减 t。
    • If first[t] is -2:
      • 设置第一个[t] = i。
    • Otherwise:
      • 设置最后[t] = i。
      • If last[t] - first[t] > bestLen:
        • 设置 bestLen = 最后[t] - 第一个[t]。
        • 设置 bestFirst = first[t] + 1。
        • 设置 bestLast = Last[t]。

(bestFirst, bestLast) 中将返回最大长度范围,或者如果不存在这样的范围,则这些变量都将为 -1。

我记得不久前在某处看到过这个解决方案,或者一个与它非常相似的解决方案——如果有人能找到它,我很乐意链接到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个字符串,找到元音和辅音数量相同的最长子串? 的相关文章

  • 如何向 OkHttp 请求拦截器添加标头?

    我将这个拦截器添加到我的 OkHttp 客户端 public class RequestTokenInterceptor implements Interceptor Override public Response intercept C
  • Java - 了解 PrintWriter 和刷新的需要

    好吧 首先我对所有代码表示歉意 但我觉得代码太多总比代码不够好 我正在制作一个简单的聊天客户端和印刷机 尤其是我正在努力解决的问题 使用现在的代码 它将与服务器类交互 并且完美地打印我想要打印的内容 但是 当我删除 writer flush
  • SimpleDateFormat 无法正确处理 DD

    我正在尝试获得这样的格式 2013 06 15 17 45 我在代码中执行以下操作 Date d new Date SimpleDateFormat ft new SimpleDateFormat YYYY MM DD HH mm Stri
  • Java 中的 TreeSet 与 C#.net 的等效项

    我有 Java 代码 其中包含TreeSet 我想将代码转换为 C 我可以使用哪个等效集合 如果没有 请提出替代方案 那将是系统 集合 通用 SortedSet
  • 使用 Thymeleaf 时我们应该删除 HTML 属性吗?

    我正在研究 Thymeleaf 发现几乎所有示例中都有 Thymeleaf 的标签值以及标准 HTML 值 例如 这些
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • Java中的运算符重载和覆盖

    运算符重载和运算符重写有什么区别 它们在继承和控制台程序中是否相同 Java 不支持运算符重载和重写 检查以下引用自的描述 http java sun com docs white langenv Simple doc2 html http
  • EasyMock : java.lang.IllegalStateException: 1 个匹配器预期,2 个记录

    我在使用 EasyMock 2 5 2 和 JUnit 4 8 2 通过 Eclipse 运行 时遇到问题 我已阅读此处所有类似的帖子 但尚未找到答案 我有一个包含两个测试的类 它们测试相同的方法 我正在使用匹配器 每个测试单独运行时都会通
  • 添加和完成 PHP 源代码文档的工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个已完成的较旧的 PHP 项目 其中有很多内容 我想以 javadoc phpDocumentor
  • 如何在Android中使用资源

    一个人如何使用资产 我有这个代码 AssetManager assets getAssets InputStream stream assets open test txt 看起来它只能在 Activity 类中使 用 如果我尝试在另一个类
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • 使用 Lint 和 SonarQube 分析 Android 项目

    我真的 溢出 了试图让这些东西一起工作 我按照这里的指示进行操作 http docs sonarqube org display PLUG Android Lint Plugin http docs sonarqube org displa
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • System.out.println("嗨"+6+10);打印Hi610?

    为什么要这样做 太令人困惑了 运算符优先级和结合性 两点 操作员 如果一个或两个参数都是字符串 则进行字符串连接 操作员 从左到右工作 所以在你的例子中 Hi 6 is Hi6 and Hi6 10 is Hi610 编辑 正如您在对另一个
  • 如何使用 Kafka 发送大消息(超过 15MB)?

    我发送字符串消息到Kafka V 0 8使用 Java Producer API 如果消息大小约为 15 MB 我会得到MessageSizeTooLargeException 我尝试过设置message max bytes到 40 MB
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g
  • 如何对数字进行排序? [复制]

    这个问题在这里已经有答案了 下面是代码 Is the sortNumber对数字进行排序的函数 a 和 b 是什么意思以及为什么存在 为什么sortNumber in n sort sortNumber 没有指定任何参数a and b Ja

随机推荐