java算法学习索引之字符串问题

一 判断两个字符串是否互为变形词

【题目】给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。

public boolean isDeformation(String str1, String str2)
{// 判断输入字符串是否为空,以及长度是否相同if (str1 == null || str2 == null || str1.length() != str2.length()) {return false;}char[] chas1 = str1.toCharArray(); // 将字符串 str1 转换为字符数组char[] chas2 = str2.toCharArray(); // 将字符串 str2 转换为字符数组int[] map = new int[256]; // 创建一个长度为 256 的辅助数组 map,用于统计字符的出现次数// 统计字符出现的次数for (int i = 0; i < chas1.length; i++) {map[chas1[i]]++; // 字符 chas1[i] 的 ASCII 值作为索引,自增对应位置的元素}// 遍历字符数组 chas2,判断字符的出现次数是否与 chas1 一致for (int i = 0; i < chas2.length; i++) {if (map[chas2[i]]-- == 0) { // 如果字符 chas2[i] 的出现次数为 0,则返回 falsereturn false;}}return true; // 返回 true,表示 str1 和 str2 互为变形词
}

函数 isDeformation 的作用是判断两个字符串 str1 和 str2 是否互为变形词。

在方法中,首先判断输入字符串 str1 和 str2 是否为空,以及它们的长度是否相同。如果条件不满足,直接返回 false

然后,将字符串 str1 和 str2 分别转换为字符数组 chas1 和 chas2

接下来,创建一个长度为 256 的辅助数组 map,用于统计字符的出现次数。

通过遍历 chas1 数组,将字符出现的次数统计到 map 数组中。

再遍历 chas2 数组,依次检查字符的出现次数,如果发现有字符的出现次数为 0,就返回 false

最后,如果没有发现出现次数不一致的情况,就返回 true,表示 str1 和 str2 互为变形词。

二  判断两个字符串是否互为旋转词

【题目】如果一个字符串为str,把字符串str前面任意的部分挪到后面形成的字符串叫作str的旋转词。比如str="12345",str的旋转词有"12345"、"23451"、"34512"、"45123"和"51234"。给定两个字符串a和b,请判断a和b是否互为旋转词。

【举例】

【要求】如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时,要求解法的时间复杂度为O(N)。

判断两个字符串是否互为旋转词的方法如下:

1. 首先判断两个字符串的长度是否相等,如果不相等,直接返回false。
2. 将字符串a与自身拼接,形成新的字符串newStr。
3. 在newStr中查找是否包含字符串b,如果包含,则说明a和b是互为旋转词,返回true;否则,返回false。

以下是一个Java示例代码实现:

```java
public boolean isRotation(String a, String b) {
    if (a.length() != b.length()) {
        return false;
    }

    String newStr = a + a;

    return newStr.contains(b);
}
```

使用KMP算法

public boolean isRotation(String a, String b) {if (a == null || b == null || a.length() != b.length()) {return false;}// 将b字符串重复一遍拼接成新的字符串b2String b2 = b + b;// 判断b2是否包含a,若包含则a和b互为旋转词,返回true;否则返回falsereturn b2.contains(a);
}// 判断字符串s是否包含子串m
private boolean getIndexOf(String s, String m) {if (s == null || m == null || m.length() < 1 || s.length() < m.length()) {return false;}char[] ss = s.toCharArray();char[] ms = m.toCharArray();int si = 0; // 字符串s的索引int mi = 0; // 子串m的索引int[] next = getNextArray(ms); // 获取子串m的next数组// 使用KMP算法进行匹配while (si < ss.length && mi < ms.length) {if (ss[si] == ms[mi]) {si++;mi++;} else if (next[mi] != -1) {// 当前字符不匹配且子串m的索引不为-1时,向前跳到next[mi]的位置mi = next[mi];} else {// 当前字符不匹配且子串m的索引为-1时,字符串s的索引向前移动一位si++;}}// 如果子串m的索引达到末尾,说明匹配成功if (mi == ms.length) {return true;} else {return false;}
}// 获取子串m的next数组
private int[] getNextArray(char[] ms) {if (ms.length == -1) {return new int[] {-1};}int[] next = new int[ms.length];next[0] = -1;next[1] = 0;int pos = 2; // 下一个计算next值的位置int cn = 0; // 当前跳到的位置while (pos < next.length) {if (ms[pos - 1] == ms[cn]) {// 当前字符与跳到的位置字符相等,next值为cn+1,pos和cn都后移next[pos++] = ++cn;} else if (cn > 0) {// 当前字符与跳到的位置字符不相等,且cn>0,向前跳到next[cn]的位置cn = next[cn];} else {// 当前字符与跳到的位置字符不相等,且cn=0,next值为0,pos后移next[pos++] = 0;}}return next;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207843.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++两个数比大小 一、题目要求 1、编程实现 2、输入输出 二、算法分析

JSP内置对象

一、request对象 1、访问请求参数 2、在作用域中管理属性 3、获取Cookie 4、解决中文乱码 5、获取客户端信息 6、显示国际化信息 是一个javax.servlet.http.HttpServletRequest对象 request封装了用户浏览器提交的信息&#xff0c;因此可以调用相应的方法可以获取这些封…

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;

Node.js入门指南(一)

目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器&#xff09; 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

《C++ Primer》第9章 顺序容器(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 C 中的容器可以分为 3 类&#xff1a;顺序容器、关联容器、无序关联容器。 9.1 顺序容器概述&#xff08;P292&#xff09; 所有顺序容器都提供了快速顺序访问的能力&#xff0c;但在以下方面的性能有所不…

Leetcode—13.罗马数字转整数【简单】

2023每日刷题&#xff08;三十七&#xff09; Leetcode—13.罗马数字转整数 算法思想 当前位置的元素比下个位置的元素小&#xff0c;就减去当前值&#xff0c;否则加上当前值 实现代码 int getValue(char c) {switch(c) {case I:return 1;case V:return 5;case X:return 1…

Web前端—移动Web第四天(vw适配方案、vw和vh的基本使用、综合案例-酷我音乐)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第四天01-vw适配方案vw和vh基本使用vw布局vh布局混用问题 02-综合案例-酷我音乐准备工作头部布局头部内容搜索区域banner 区域标题公共样式排行榜内容推荐歌单布局推荐歌单内…

MAX/MSP SDK学习04:Messages selector的使用

其实消息选择器在simplemax示例中就接触到了&#xff0c;但这文档非要讲那么抽象。目前为止对消息选择器的理解是&#xff1a;可判断接收过来的消息是否符合本Object的处理要求&#xff0c;比如加法对象只可接收数值型的消息以处理&#xff0c;但不能接收t_symbol型的消息&…

zookeeper单机版的搭建

一 zookeeper的搭建 1.1 上传zkjar包 1.2 搭建配置 1.解压压缩包 [rootlocalhost export]# tar -zxvf zookeeper-3.7.0-bin.tar.gz 2.创建data文件夹 [rootlocalhost export]# cd apache-zookeeper-3.7.0-bin/ [rootlocalhost apache-zookeeper-3.7.0-bin]# ls bin conf…

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了&#xff0c;出现问题耗费了至少一刻钟time&#xff0c;然后才搞出来正常的效果&#xff1b; 效果镇楼 另外重新安装了VScode软件&#xff0c;原来的老是报错&#xff0c;bug。。&#xff1b; 2个必要的安装命令&#xff1b; 然后建立必要的文件夹和文件&…

CentOS 7启动时报“Started Crash recovery kernel arming.....shutdown....”问题处理过程

有台虚拟机由于CPU负载过高而宕机&#xff0c;宕机重启后停在“Started Crash recovery kernel arming…shutdown…”阶段&#xff0c;如下所示&#xff1a; 重置虚拟机&#xff0c;进入grub菜单&#xff0c;按e编辑启动选项&#xff0c;在linux16 行末&#xff0c;加上&…