正方形字符串解题思路

本文介绍了如何解决寻找字符串中最长正方字符串的问题。正方字符串定义为形如x+x的形式。首先提出暴力解法,通过两层循环查找相同字母并比较子串,时间复杂度为O(n^3)。接着优化思路,使用哈希映射记录字符位置,降低时间复杂度至O(n^2),空间复杂度升至O(n)。并提供了优化后的代码实现。
摘要由CSDN通过智能技术生成

之前做到一道算法题感觉挺有意思的,题目内容如下:

给你一个字符串str,你必须让找到这个字符串中的最长的正方字符串,正方字符串是以下的形式
str = x + x; where x is any string. Return length of this square string.
Example
str = ababa
Max length square string = 4;
str = abcd
Max length square string = 1;

我思考了一下,认为首先可以用暴力解法。因为要满足正方字符串,必须是x+x,所以突破口可能是找到一个数组里2个相同的字母,再判断2个字母之间的子串和第二字母后面相同长度的子串是否相等。大致的思路为遍历2遍数组,第一遍的下标i从0到length-1,找到一个数组的元素,第二遍从i+1到length-1遍历,找到和第一遍遍历相同的元素,然后计算它们自己的间隔,看间隔子串是否和第二个字母后续相同长度的子串是否一样。这样的时间复杂度应该是o(n^3) (最差情况,2层循环o(n^2),匹配子串最差的情况是o(n))。空间复杂度因为只使用了临时变量,应该只有o(1)

后来再思考了一下,其实寻找位置的时候可以通过先遍历一遍数组,用map记录下每一个字符在哪些位置出现过。后续第二遍计算子串是否匹配时可以少一层遍历的时间复杂度,直接用map定位相同字母的位置。这种方式就是以时间换空间

代码如下:

    public static int getSquareString(String str) {
        if (str == null || str.length() 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值