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. You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well 错误

    我打开项目报错是这样的  pom.xml jdk配置什么的都是好的    但是还是报错 解决错误 : 1.打开你eclipse的根目录,找到eclipse.ini  这个文件夹打开 2.打开是这个样子 ...

  2. 微信小程序中如何设置跳转页面

    修改project.config.json内容 "cloudfunctionRoot":"cloud", //配置云开发的路径 更改app.js文件内容 App ...

  3. ARP欺骗工具-arpspoof

    arpspoof arpspoof是dsniff下的一个ARP欺骗工具 大概原理: 两台主机HostA 和 HostB想要进行通信的流程,那么主机A将需要知道自己的ip,mac 以及主机B的ip, m ...

  4. ArcMap将Python写的代码转为工具箱与自定义工具

      本文介绍在ArcMap软件中,通过已有的Python脚本程序,建立新的工具箱并在其中设置自定义工具的方法.   通过本文介绍的操作,我们便可以实现将自己的Python代码封装,并像其他ArcGIS ...

  5. Linux报错:audit: backlog limit exceeded(审计:超出积压限制)

    Linux报错:audit: backlog limit exceeded(审计:超出积压限制) 系统版本:CentOS Linux release 7.6.1810 (Core) 问题现象:一次巡检 ...

  6. QML和QT

    推荐一些学习qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html,这是一个由Qt官方提供的完整的QML教程,包含了所有基本知识和高级语法. ...

  7. 全渠道定价、库存决策,运筹混合整数规划建模求解,MNL选择模型,内附代码!

    0. 写在前面 刊论文!模型简单,代码实现更简单,墙裂推荐!可为运筹建模提供参考,也可作为全渠道零售研究的入门资料ε٩(๑> ₃ <)۶з 全文有点长,前面先放一个博文结构和涉及内容: 第 ...

  8. 系统优化脚本支持Ubuntu和CentOS

    系统优化脚本支持Ubuntu和CentOS 经常会部署各种用途的操作系统,但在这些工作中,我们会发现很多工作其实是重复性的劳动,操作的内容也是大同小异,基于这类情况,我们可以把相同的操作做成统一执行的 ...

  9. python入门教程之八列表,字典,字符串,集合常用操作

    一列表常用方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表元素最大值 4 mi ...

  10. 随机指标KDJ

    kdj是循环指标,它的金叉与死叉可以指导买入或卖出,要根据周线(是否为多方市场).日线(是否存在金叉).小时线(金叉定位)来买入,要根据周线(是否为多方市场).日线(是否存在死叉).小时线(死叉定位) ...