首尾字符相同的子字符串的数目

2023-12-27 04:38

本文主要是介绍首尾字符相同的子字符串的数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接上栗子:

假如输入字符是:

"abcab"

那么输出结果为:

7

解释:该字符串所有的子字符串列出来,你会发现,首尾字符相同的子字符串有:

"a"
"abca"
"b"
"bcab"
"c"
"a"
"b"

一共七个,所以输出7。

再举个栗子:

输入字符串:

cab

输出:

3

解释,首尾字符相同的子字符串有:

"c"
"a"
"b"

栗子已经很很清楚了,其实题目也比较简单,那么首先想到的肯定是把所有的子字符串全部搞出来,然后判断一下首尾字符是否相同,就可以了。

这个想法当然可行,但是时间复杂度较高,属于 O(n2) 级别的,所以还得想办法。

从第二个栗子我们已经可以看出,其实输出结果还是跟字符串本身的长度是有关系的,这是因为把字符串中任意一个字符单独拿出来就是符合题意的子字符串,当然,结果一般比字符串长度要大。

那么我们可以这么想了,假如一个字符串中有一种字符它出现了n次:

"....a......a......a.......a......."

那么以相同的字符所在位置截取的字符串肯定是符合题意的,那么这样的字符串又有多少种呢,答案很显然: C2n 种,也就是n个中任意挑选两个,发现这个规律以后,那么代码就很好写了,当然要计算组合个数,首先要对字符进行统计:

#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26;int countSubstringWithEqualEnds(string s)
{int result = 0;int n = s.length();int count[MAX_CHAR] = {0};for (int i=0; i<n; i++)count[s[i]-'a']++;for (int i=0; i<MAX_CHAR; i++)result += (count[i]*(count[i]+1)/2);return result;
}int main()
{string s("abcab");cout << countSubstringWithEqualEnds(s);return 0;
}

这个时间复杂度就是 O(n) 级别的了。

这篇关于首尾字符相同的子字符串的数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541903

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字