2023-01-08:小红定义一个仅有r、e、d三种字符的字符串中,
如果仅有一个长度不小于2的回文子串,那么这个字符串定义为"好串"。
给定一个正整数n,输出长度为n的好串有多少个。
结果对10 ^ 9 + 7取模, 1 <= n <= 10^9。
示例:
n = 1, 输出0,
n = 2, 输出3,
n = 3, 输出18。
来自阿里。

答案2023-01-08:

打表找规律。reer好串,因为能找到两个回文子串。所以回文子串长度要么是2,要么是3。
符合子串的要么是xx,要么是xyx。注意xxx不是好串。
时间复杂度:O(1)。
空间复杂度:O(1)。
代码用rust和solidity编写。

代码用rust编写。代码如下:

use std::iter::repeat;
fn main() {
for i in 1..=10 {
println!("长度为{}, 答案:{},{}", i, num1(i), num2(i));
}
} // 暴力方法
// 为了观察规律
// 具体方法论,在体系学习班,章节39 : 根据对数器找规律
fn num1(n: i32) -> i32 {
let mut p: Vec<u8> = repeat(0).take(n as usize).collect();
return process1(&mut p, 0);
} fn process1(p: &mut Vec<u8>, i: i32) -> i32 {
if i == p.len() as i32 {
let mut dp = get_manacher_dp(p);
let mut cnt = 0;
for p in dp.iter() {
if p - 1 > 3 {
return 0;
}
if p - 1 >= 2 {
cnt += 1;
}
if cnt > 1 {
return 0;
}
}
return if cnt == 1 { 1 } else { 0 };
} else {
let mut ans = 0;
p[i as usize] = 'r' as u8;
ans += process1(p, i + 1);
p[i as usize] = 'e' as u8;
ans += process1(p, i + 1);
p[i as usize] = 'd' as u8;
ans += process1(p, i + 1);
return ans;
}
} fn get_manacher_dp(s: &mut Vec<u8>) -> Vec<i32> {
let mut str = manacher_string(s);
let mut p_arr: Vec<i32> = repeat(0).take(str.len()).collect();
let mut cc = -1;
let mut rr = -1;
for i in 0..str.len() as i32 {
p_arr[i as usize] = if rr > i {
get_min(p_arr[(2 * cc - i) as usize], rr - i)
} else {
1
};
while i + p_arr[i as usize] < str.len() as i32 && i - p_arr[i as usize] > -1 {
if str[(i + p_arr[i as usize]) as usize] == str[(i - p_arr[i as usize]) as usize] {
p_arr[i as usize] += 1;
} else {
break;
}
}
if i + p_arr[i as usize] > rr {
rr = i + p_arr[i as usize];
cc = i;
}
}
return p_arr;
} fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
} fn manacher_string(s: &mut Vec<u8>) -> Vec<u8> {
let mut res: Vec<u8> = repeat(0).take(s.len() * 2 + 1).collect();
let mut index = 0;
let mut i = 0;
while i != res.len() {
res[i as usize] = if (i & 1) == 0 {
'#' as u8
} else {
index += 1;
s[index - 1]
};
i += 1;
}
return res;
} // 正式方法
// 观察规律之后,把规律变成代码
fn num2(n: i32) -> i32 {
if n == 1 {
return 0;
}
if n == 2 {
return 3;
}
if n == 3 {
return 18;
}
return 6 * (n + 1);
}

代码用solidity编写。diam如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17; contract Hello{
function main() public pure returns (int32[] memory){
int32[] memory ans = new int32[](10);
for (int32 i = 1; i <= 10; i++) {
ans[uint32(i-1)] = num2(i);
}
return ans;
} // 正式方法
// 观察规律之后,把规律变成代码
function num2(int32 n) public pure returns(int32) {
if (n == 1) {
return 0;
}
if (n == 2) {
return 3;
}
if (n == 3) {
return 18;
}
return 6 * (n + 1);
} }

2023-01-08:小红定义一个仅有r、e、d三种字符的字符串中, 如果仅有一个长度不小于2的回文子串,那么这个字符串定义为“好串“。 给定一个正整数n,输出长度为n的好串有多少个。 结果对10^9的更多相关文章

  1. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...

  2. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  3. 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  4. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  5. 小白月赛13 B小A的回文串 (马拉车算法求最长回文子串)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  6. Codeforces Round #265 (Div. 2) C. No to Palindromes! 构造不含回文子串的串

    http://codeforces.com/contest/465/problem/C 给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,且串中字母在一定 ...

  7. leetcode 求一个字符串的最长回文子串

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串.   给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...

  8. UVA401(回文子串和镜像串)

    可以先设一个常量镜像串,直接返回比较 #include <iostream> #include <string> #include <cstring> #inclu ...

  9. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  10. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

随机推荐

  1. AppScan的安装及破解1

    (一)AppScan的安装及破解   IBM AppScan是一款目前最好用的Web 应用安全测试工具,Rational AppScan 可自动化 Web 应用的安全漏洞评估工作,能扫描和检测所有常见 ...

  2. 有时候用uniapp写项目时发现,Map组件在安卓真机可以缩放和移动,但是在ios真机就不行

    如果你的地图组件是放到popup组件里,是用弹框打开的,如何ios端不能缩放, 那你一定要看下这个弹框的层级是否比地图层级要高  z-index. 如果高于地图层级,那地图肯定是不能移动和缩放的

  3. Keil Jlink没法找到STM32H750

    https://www.amobbs.com/thread-5713382-1-1.html MDK使用的是5.32,jlink使用的是9.2jlink驱动使用的是6.44b 删除工程下的JLinkS ...

  4. Unity录音保存wav

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  5. 【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)

    复原IP地址 力扣题目链接(opens new window) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 ...

  6. 关于两行代码让我时间无限拉长这件事------mainServlet

    在再一次尝试实现增删改查的功能时,出现了一些BUG,修改功能一直实现不了,查了好久的资料,这才发现问题 如上图所示,这个Servlet里面定义的方法,虽然很短,但是重要的很奥,改了好久都没注意到这个问 ...

  7. ACM需要知道的STL小技巧

    天天用stl,但是有一些小技巧如果不知道,偶尔会导致TLE,这里说几个打比赛需要用到的. 主要是大概了解一下其底层原理:https://www.jianshu.com/p/834cc223bb57 就 ...

  8. java面向对象-基础入门

    java面向对象-基础入门 面向过程:线性思维 面向对象思维:物以类聚,分类的思维 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是具体到某个微观 ...

  9. LockSupport 详解

    更多内容,前往IT-BLOG LockSupport 用来创建锁和其他同步类的基本线程阻塞原语.简而言之,当调用 LockSupport.park时,表示当前线程将会等待,直至获得许可,当调用 Loc ...

  10. vue中 computed和watch的一些简单理解(区别)

    今天看到一个问题,就是vue的computed和watch要在哪些场景下使用,其实也就是在问他们的区别.computed也就是计算属性,它可以帮助我们将在模板中的一些稍微复杂的逻辑计算放回到js代码中 ...