这篇文章主要为大家介绍了Java C++题解leetcode字符串轮转KMP算法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
题目要求
思路一:双指针(模拟)
Java
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length())
return false;
int n = s1.length();
if (n == 0)
return true;
for (int i = 0; i < n; i++) {
boolean res = true;
for (int j = 0; j < n; j++) {
if (s1.charAt((i + j) % n) != s2.charAt(j)) {
res = false;
break;
}
}
if (res)
return true;
}
return false;
}
}
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
C++
class Solution {
public:
bool isFlipedString(string s1, string s2) {
if (s1.size() != s2.size())
return false;
int n = s1.size();
if (n == 0)
return true;
for (int i = 0; i < n; i++) {
bool res = true;
for (int j = 0; j < n; j++) {
if (s1[(i + j) % n] != s2[j]) {
res = false;
break;
}
}
if (res)
return true;
}
return false;
}
};
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
思路二:子串
手写KMP
KMP的思路可以参考KMP 算法详解和详解KMP算法
Java
get_next
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length())
return false;
int n = s1.length();
if (n == 0)
return true;
int[] nxt = new int[n];
nxt[0] = -1;
int j = 0; // pat指针
int k = -1; // 跳转位置
while (j < n - 1) {
if (k == -1 || s2.charAt(j) == s2.charAt(k)) {
if (s2.charAt(++j) == s2.charAt(++k))
nxt[j] = nxt[k]; // 连续相同
else
nxt[j] = k;
}
else
k = nxt[k];
}
String txt = s1 + s1;
j = 0;
for (int i = 0; i < 2 * n; i++) {
if (j < n && txt.charAt(i) == s2.charAt(j))
j++;
else {
j = nxt[j];
if (j == -1)
j++;
}
if (j == n)
return true;
}
return false;
}
}
dp
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length())
return false;
int n = s1.length();
if (n == 0)
return true;
int[][] dp = new int[n][256]; // dp[state][char] = nxt state
dp[0][s2.charAt(0)] = 1;
int x = 0; // 影子状态
for (int s = 1; s < n; s++) {
for (int c = 0; c < 256; c++)
dp[s][c] = dp[x][c];
dp[s][s2.charAt(s)] = s + 1;
x = dp[x][s2.charAt(s)];
}
String txt = s1 + s1;
int state = 0;
for (int i = 0; i < 2 * n; i++) {
state = dp[state][txt.charAt(i)];
if (state == n)
return true;
}
return false;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)
C++
get_next
class Solution {
public:
bool isFlipedString(string s1, string s2) {
if (s1.size() != s2.size())
return false;
int n = s1.size();
if (n == 0)
return true;
int nxt[n];
nxt[0] = -1;
int j = 0; // pat指针
int k = -1; // 跳转位置
while (j < n - 1) {
if (k == -1 || s2[j] == s2[k]) {
if (s2[++j] == s2[++k])
nxt[j] = nxt[k]; // 连续相同
else
nxt[j] = k;
}
else
k = nxt[k];
}
string txt = s1 + s1;
j = 0;
for (int i = 0; i < 2 * n; i++) {
if (j < n && txt[i] == s2[j])
j++;
else {
j = nxt[j];
if (j == -1)
j++;
}
if (j == n)
return true;
}
return false;
}
};
dp
class Solution {
public:
bool isFlipedString(string s1, string s2) {
if (s1.size() != s2.size())
return false;
int n = s1.size();
if (n == 0)
return true;
int dp[n][256]; // dp[state][char] = nxt state
memset(dp, 0, sizeof(dp));
dp[0][s2[0]] = 1;
int x = 0; // 影子状态
for (int s = 1; s < n; s++) {
for (int c = 0; c < 256; c++)
dp[s][c] = dp[x][c];
dp[s][s2[s]] = s + 1;
x = dp[x][s2[s]];
}
string txt = s1 + s1;
int state = 0;
for (int i = 0; i < 2 * n; i++) {
state = dp[state][txt[i]];
if (state == n)
return true;
}
return false;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
调API
Java
class Solution {
public boolean isFlipedString(String s1, String s2) {
return s1.length() == s2.length() && (s1 + s1).contains(s2);
}
}
- 时间复杂度:O(n),取决于语言匹配子字符串机制
- 空间复杂度:O(n)
C++
class Solution {
public:
bool isFlipedString(string s1, string s2) {
return s1.size() == s2.size() && (s1 + s1).find(s2) != string::npos;
}
};
- 时间复杂度:O(n),取决于语言匹配子字符串机制
- 空间复杂度:O(n)
impl Solution {
pub fn is_fliped_string(s1: String, s2: String) -> bool {
s1.len() == s2.len() && s2.repeat(2).contains(&s1)
}
}
- 时间复杂度:O(n),取决于语言匹配子字符串机制
- 空间复杂度:O(n)
总结
做过了轮转的题就能很快意识到拼接然后找子串,本来调个API结束结果发现了KMP算法,就浅学一下~
时间耗在算法了就掠过rust
各种辣~
以上就是Java C++题解leetcode字符串轮转KMP算法详解的详细内容,更多关于Java C++ 字符串轮转KMP算法的资料请关注编程学习网其它相关文章!
织梦狗教程
本文标题为:Java C++题解leetcode字符串轮转KMP算法详解


基础教程推荐
猜你喜欢
- 工厂方法在Spring框架中的运用 2023-06-23
- Java使用EasyExcel进行单元格合并的问题详解 2023-01-18
- 一文了解Java 线程池的正确使用姿势 2023-06-17
- 用java实现扫雷游戏 2022-12-06
- Project Reactor源码解析publishOn使用示例 2023-04-12
- Java去掉小数点后面无效0的方案与建议 2023-02-18
- JVM分析之类加载机制详解 2023-04-06
- Java File类的概述及常用方法使用详解 2023-05-18
- SpringBoot配置文件中密码属性加密的实现 2023-03-11
- 全局记录Feign的请求和响应日志方式 2023-01-09