Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这个回文分割算法的时间复杂度是多少?

这个回文分割算法的时间复杂度是多少?
EN

Stack Overflow用户
提问于 2014-07-05 16:14:48
回答 2查看 6.3K关注 0票数 8

回文分区

给定一个字符串s,分区的每个子字符串都是一个回文。 返回s的所有可能的回文分区。

我个人认为,时间复杂度是O(n^n),n是给定字符串的长度。

谢谢Dan ,紧时间复杂度= O(n* (2^n)),请查看下面的详细信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <vector>
using namespace std;

class Solution {
public:
vector<vector<string>> partition(string s) {
    vector<vector<string>> list;
    vector<string> subList;

    // Input validation.
    if (s.length() <= 1) {
        subList.push_back(s);
        list.push_back(subList);
        return list;
    }

    int len = s.length();
    vector<vector<bool>> memo(len, vector<bool>(len));
    for (int i = 0; i < len; i ++) {
        for (int j = 0; j < len; j ++) {
            if (i >= j) memo[i][j] = true;
            else memo[i][j] = false;
        }
    }

    int start = 0;
    helper(s, start, list, subList, memo);

    return list;
}

void helper(string s, int start, 
            vector<vector<string>> &list, vector<string> &subList,
            vector<vector<bool>> &memo) {

    // Base case.
    if (start > s.length() - 1) {
        vector<string> one_rest(subList);
        list.push_back(one_rest);
        return;
    }

    for (int len = 1; start + len <= s.length(); len ++) {
        int end = start + len - 1;

        memo[start][end] = (len == 1) ||
                           (memo[start + 1][end - 1] && s[start] == s[end]);

        if (memo[start][end] == true) {
            // Have a try.
            subList.push_back(s.substr(start, len));

            // Do recursion.
            helper(s, end + 1, list, subList, memo);

            // Roll back.
            subList.pop_back();
        }
    }
}
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-05 17:43:31

最坏的运行时间是O(n * 2^n)。当然,这是指数级的,但不像O(n^n)那么糟糕。

下面是我如何获得O(n * 2^n):顶级函数有一个O(n^2)循环来初始化备忘录,然后调用整个字符串的助手。因此,如果我们用(s.length()-start)等于n的调用助手的代价编写H(n),那么算法的总成本将是

成本= H(n) + O(n^2)

H(n)的基本情况是,当s.length() - start = 1时,它只是复制列表的成本:

H(1) = O(n)

对于递归情况,如果每次if条件memo[start][end]true,则对size (n- 1 )、(n- 2 )、(n-3)、.、2、1进行(n-1)递归调用。除了对helper的递归调用外,还必须调用相同大小的substr函数,总共要花费O(n^2)。因此,对n>1而言,H(n)的总体成本是

H(n) = H(n-1) + H(n-2) +.+ H(1) + O(n^2)

(我会把它写成求和,但不支持LaTeX。)

现在,您可以为H(n-1)编写相同的表达式,然后将其替换为back以简化:

H(n) =2H(n-1)+ O(n)

这解决了

H(n) = O(n * 2^n)

由于它大于O(n^2),所以整个成本也是O(n * 2^n)。

Note:您可以通过在一个O(n^3)循环中预先计算所有子字符串来稍微改进这一点。您也可以对memo数组执行同样的操作。然而,这并没有改变渐近大O界。

实际上,O(n * 2^n)是最优的,因为在最坏的情况下,字符串是同一个字符重复n次,如"aaaaaa",在这种情况下,有2^n个可能的分区,每个分区的大小都为n,其总输出大小为Ω(n * 2^n)。

票数 5
EN

Stack Overflow用户

发布于 2015-07-05 19:52:02

应该是O(n*2^n)。你基本上是在尝试所有可能的分区。对于长度为n的字符串,将有2^(n-1)方式对其进行分区。这是因为,一个分区相当于在b/t两个字符中放置一个“x”。有n-1这样的插槽来放置一个“\”。每个插槽只有两种选择--放置“\”或不放置“\”。因此,2^(n - 1)放置的方法。

然后,对于每个唯一的分区,您必须遍历整个字符串(在最坏的情况下,当您有重复字符时),以确保每个分区都是回文。所以n*2^(n-1)= O (n *2^n)。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24591616

复制
相关文章
算法的时间复杂度
作为一个非典型的前端开发人员,我们要懂得一些算法的概念,并将其理论知识引入日常的开发中,提高日常的开发效率和提升产品的体验。
Jimmy_is_jimmy
2019/07/31
1.2K0
回溯算法:分割回文串
题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/
代码随想录
2020/11/10
6990
回溯算法:分割回文串
算法时间复杂度
     算法复杂度分为时间复杂度和空间复杂度,一个好的算法应该具体执行时间短,所需空间少的特点。      随着计算机硬件和软件的提升,一个算法的执行时间是算不太精确的。只能依据统计方法对算法进行估算。我们抛开硬件和软件的因素,算法的好坏直接影响程序的运行时间。      我们看一下小例子:      int value = 0;                         // 执行了1次      for (int i = 0; i < n; i++) {       // 执行了n次      
lpxxn
2018/01/31
1K0
算法时间复杂度
算法时间复杂度
算法的时间复杂度是指在问题规模为 时整个算法执行的基本语句单元次数,记为 。
hotarugali
2022/03/02
1.7K0
算法时间复杂度
算法时间复杂度
虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。
九州暮云
2019/08/21
8120
算法时间复杂度
算法时间复杂度
很多程序员,做了很长时间的编程工作却始终都弄不明白算法的时间复杂度的估算,这是很可悲的一件事情。因为弄不清楚,所以也就从不深究自己写的代码是否效率底下,是不是可以通过优化,让计算机更加快速高效。所以在我最近自学看完算法的时间复杂度这个章节之后,我决定写一篇文章回顾,加深记忆,帮助理解。
Originalee
2018/08/30
8350
算法—算法的时间空间复杂度
PS:如果ax =N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN,读作以a为底N的,其中a叫做对数的底数,N叫做真数。
思想者杰克
2021/11/04
1.1K0
算法 - 时间复杂度
极客时间 - 数据结构与算法之美 - 03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
颇忒脱
2019/03/13
7030
算法—时间复杂度[通俗易懂]
时间和空间都是计算机资源的重要体现,而算法的复杂性就是体现在运行该算法时的计算机所需的资源多少;
全栈程序员站长
2022/08/27
3K0
算法—时间复杂度[通俗易懂]
算法时间复杂度的计算
在进行算法分析时候,语句总的执行次数T(n)是关于问题规模n的函数,进而分型T(n)随着n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间度量记作:T(n)=O(f(n)).它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度.其中f(n)是问题规模n的某个函数.
全栈程序员站长
2022/08/28
1.3K0
算法时间复杂度的计算
理解算法的时间复杂度[每日前端夜话0x82]
在计算机科学中,算法分析是非常关键的部分。找到解决问题的最有效算法非常重要。可能会有许多算法能够解决问题,但这里的挑战是选择最有效的算法。现在关键是假如我们有一套不同的算法,应该如何识别最有效的算法呢?在这里算法的空间和时间复杂度的概念出现了。空间和时间复杂度是算法的测量尺度。我们根据它们的空间(内存量)和时间复杂度(操作次数)来对算法进行比较。
疯狂的技术宅
2019/06/17
1.1K0
理解算法的时间复杂度[每日前端夜话0x82]
递归算法的时间复杂度
递归算法应该都不陌生,其实最开始遇见递归应该是在数学课上,类似于f(x)=f(x-1)+f(x+1),f(1)=1,f(2)=4,f(3)=3这种数学题大家应该见过不少,其实思想就是层层递归,最终将目标值用f(1),f(2),f(3)表示。
宜信技术学院
2019/06/28
2.2K0
算法中的时间复杂度
程序员写代码过程中总要用到算法,而不同的算法有不同的效率,时间复杂度是用来评估的算法的效率的一种方式。
张云飞Vir
2020/03/23
1.2K0
算法的时间复杂度与空间复杂度
一、说明 时间复杂度和空间复杂度是用来评价算法效率高低的2个标准,身为开发者肯定会经常会听到这2个概念,但它们分别是什么意思呢? 其实这两个概念从字面意思上也能看出一二: 时间复杂度:就是说执行算法需
Umbrella1024
2021/02/28
1.6K0
【算法】复杂度理论 ( 时间复杂度 )
时间复杂度 : 描述一个算法执行的大概效率 ; 面试重点考察 ; 面试时对时间复杂度都有指定的要求 , 蛮力算法一般都会挂掉 ;
韩曙亮
2023/03/29
1.4K0
算法的时间复杂度与空间复杂度
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 例如之前的斐波那契数:
有礼貌的灰绅士
2023/03/28
1.1K0
算法的时间复杂度与空间复杂度
算法(一)时间复杂度
前言 算法很重要,但是一般情况下做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏NBA2K17的生涯模式,没有比赛的日子也都是训练,而且这些训练都是自发的,没有人逼你,从早上练到晚上,属性也不涨,但是如果日积月累,不训练和训练的人的属性值就会产生较大差距。这个突然让我意识到了现实世界,要想成为一个球星(技术大牛)那就需要日积月累的刻意训练,索性放下游戏,接着写文章吧。 1.算法的
用户1269200
2018/02/01
8440
算法(一)时间复杂度
常见算法时间复杂度
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
全栈程序员站长
2022/08/28
5770
算法的时间复杂度和空间复杂度-总结[通俗易懂]
通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。 算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法。
全栈程序员站长
2022/08/27
1.5K0
算法的时间复杂度和空间复杂度计算
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,是一种“渐进表示法”。其中f(n)是问题规模n的某个函数。
全栈程序员站长
2022/08/28
2.4K0
算法的时间复杂度和空间复杂度计算

相似问题

这个算法寻找最长回文子串的时间复杂度是多少?

20

这个算法的时间复杂度是多少?

13

这个算法的时间复杂度是多少?

22

这个算法的时间复杂度是多少?

33

这个算法的时间复杂度是多少?

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文