算法基础:周期串问题

如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。

输入参数: 字符串

返回值: 字符串最小周期

代码实现:

package huawei

import (
	"bufio"
	"fmt"
	"os"
)

func Test1Base() {
	fmt.Println("Please input the res string:")
	//从控制台读取数据
	inputReader := bufio.NewReader(os.Stdin)
	s, err := inputReader.ReadString('\n')
	checkError(err, "Reading data from command line")
	//去除末尾换行符
	s = string(s[:len(s)-1])

	period := getMinPeriod(s)
	fmt.Println("period:", period)
}

//获取字符串最小周期
func getMinPeriod(s string) int {
	resChars := []rune(s)

	for count := 1; count <= len(resChars)/2; count++ {
		if checkPeriod(resChars[:count], resChars) {
			return count
		}
	}

	return -1
}

//判断testChars是否为resChars的一个周期,如abc是abcabcabc的一个周期
func checkPeriod(testChars []rune, resChars []rune) bool {
	testLen, resLen := len(testChars), len(resChars)
	//不是整数倍,直接返回false
	if resLen%testLen != 0 {
		return false
	}

	for i := testLen; i < resLen; i += testLen {
		if !checkSliceEqual(resChars[i:i+testLen], testChars) {
			return false
		}
	}

	return true
}

//判断两个slice的元素是否相同
func checkSliceEqual(a []rune, b []rune) bool {
	if len(a) != len(b) {
		return false
	}

	for i := 0; i < len(a); i++ {
		if a[i] != b[i] {
			return false
		}
	}

	return true
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 09:27:13

算法基础:周期串问题的相关文章

算法篇——最小周期串

来源:<算法竞赛入门经典>例题5.1.3 题目:如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期.例如,abcabcabcabc以3为周期(注意,它也以6和12为周期).输入一个长度不超过80的串,输出它的最小周期. 样例输入:HoHoHo 样例输出:2 分析:题目中说过,字符串可能会有多个周期.但因为只需求出最小的一个,可以从小到大枚举各个周期,一旦符合条件就立即输出. 源码: #include<stdio.h> #include<string.h

算法竞赛入门经典 5.1.3 周期串

5.1.3  周期串 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以为周期.例如,abcabcabcabc以3为周期(注意,它也以6和12为周期).输入一个长度不超过80的串,输出它的最小周期. 样例输入:HoHoHo 样例输出:2 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char s[100]; sca

编程算法基础-一刀切法

1.5一刀切法 编程和编筐一样,处理边缘问题相同重要. 程序逻辑 開始 中间 结束 一刀切法上式 用空格或逗号分隔的串,提取为各个部分 abc ttt,kmd,uuu xyz 切分成每一部分. /* * "abc ttt,kmd,uuu xyz" 用逗号或者空格隔开字符串 分解为各个部分 */ package OneCut; public class SplitString { public static void main(String[] args) { // 一刀切(上式:事先补

编程算法基础-2.7作业-通讯编码-格式检查

作业 通信编码 如果通信的物理设备仅仅能表示1和0两种状态. 1和0状态都不能持续太久,否则物理设备会出现问题.因而人们设计出一种变通的方法: 多个0后人为地补入一个1 多个1后人为地补入一个0 当然,在解码的时候,要对应处理. 以下我们用串来模拟这个算法. 如果有须要通信的串: String s = "1010100100100001011110100010101010100001010101111"; 连续的3个0,后须要插入一个1 连续的3个1,后须要输入一个0 10101001

java 算法基础

1.算法概要 算法是用于计算.数据处理和自动推理使用的.算法主要是做精确计算和表示一个有限长列的有效方法.算法一般包含清晰定义的指令用于计算函数.基本上也属于一种思考最简洁的方式. 2.算法特征 算法主要包含五个特征 2.1.有穷性: 是指算法必须能在执行有限个步骤后终止: 2.2.确切性: 算法的每一个步骤必须有确切的定义: 2.3.输入项: 一个算法输入有0或多个输入,以刻画预算对象的初始情况,所谓0就是初始化条件: 2.4.输出项: 反馈对数据加工后的结果.没有输出的算法无意义. 2.5.

E - Power Strings,求最小周期串

E - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2406 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = &

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操

python小白-day4递归和算法基础

递归&算法基础 一.递归 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出. 1 2 3 4 5 6 7 8 def calc(n):     print(n)     if n/2>1:         r

【周期串】NYOJ-1121 周期串

[题目链接:NYOJ-1121] 例如:abcabcabc 该字符串的长度为9,那么周期串的长度len只可能为{1,3,9},否则就不可能构成周期串. 接下来,就是要在各周期间进行比较.描述不清...自己走一遍就懂了. 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int MAXN = 202; 5 char s[MAXN]; 6 int main(){ 7 while((cin &g

算法——基础篇——快速排序

快速排序是一个经常使用的算法,由于每次用的时候,都感觉没有理解清楚,特写一篇文章记录一下. 算法介绍 快速排序有点类似有冒泡排序,冒泡排序从相邻的两个元素比较,小的在左边,大的在右边,这个算法很容易理解.而快速排序它相当于是在一头一尾两边分别排序比较,比较的对象是当前元素值,和一个选定的key值,主题的思想就是通过跟key值比较,把大于key的值放在右边,小于的放在左边这样就完成了一次排序,接着在对key值左边的序列进行同样的操作,右边也是,最后便能将所有的元素给排好序,由于它每次排序,都会分成