摘要: 问题给定一个字符串s,切割s使该切割结果中每一个子串都是一个回文。返回所有可能的回文分割集合。例如,如果有s= "aab",返回[a,a,b][aa,b]初始思路有了回文分割II(Palindrome Partitioning II)的经验,这里很容易就可以得到递归分解子集的方案。只是在回文分割II中我们是统计切割次数,而这里要保存分割出来的子串。这里需要再强调一次枚举一个集合所有分割可能的经典递归循环,基本所有分割类问题都会用到:if(start < s.size()){ size_t pos = start; while(pos < s.size()) {. 阅读全文
posted @ 2013-05-20 22:56 Shawnone 阅读(786) 评论(0) 推荐(0) 编辑
摘要: 前言在软件开发行业中实际工程做得久了,大多数人会发现很少有机会接触到各种算法。正如Reddit上有人评论到,当初进公司的时候通过了n轮算法面试,实际工作却很可能是不断的解“null pointer exception”的bug。但是算法作为软件开发的基础的重要性确是不容置疑的,由此我最近突然想要练习练习算法题,补充一下工作中接触不到的知识。在探索过程中发现了LeetCode这个网站,其中Online Judge部分有不少不错的练习题,遂打算在博客中分享解题经验。我google了一下目前分享LeetCode的博客,大多全篇代码或比较简单的解题报告。对于经过ACM训练的人可能看到要点就能领悟了,但 阅读全文
posted @ 2013-05-19 23:25 Shawnone 阅读(5194) 评论(2) 推荐(3) 编辑
摘要: 上星期在做visual studio自动构建的时候,突然发现build过程的日志没有在命令行输出,这样子一旦build失败,就看不到错误原因了。奇怪的是以前是可以看到这些日志的。先后怀疑了CMakeList.txt,构建脚本后,终于发现脚本中有一句devenv solution.sln /rebuild被改成了devenv.exe solution.sln /rebuild 。诱因找到了,背后的原理何在?MSDN的这个页面有很好的说明,Devenv Command Line Switches。The devenv.com utility provides for the delivery of 阅读全文
posted @ 2012-02-20 22:45 Shawnone 阅读(1387) 评论(0) 推荐(0) 编辑
摘要: 目的在不依赖名字空间或函数模板重载决议的前提下支持运算符重载。别称技巧的发明者最初将其称为限定的模板展开(Restricted Template Expansion),但是这个术语从来没有被广泛使用。动机1994年,John Barton和Lee Nackman为了解决当时C++实现上的限制,首次发表了这个惯用法。虽然现在此惯用法的原始用途已经不再必须,现行的标准仍然保留了对它的支持。在John Barton和Lee Nackman发明这个惯用法的时期,C++不支持函数模板的重载,而且很多C++实现尚不支持名字空间。当需要为类模板定义运算符重载时,这会导致一些问题。考虑下面的类:templat 阅读全文
posted @ 2011-12-28 23:59 Shawnone 阅读(1380) 评论(0) 推荐(1) 编辑
摘要: 怎样在set中放入自定义类型?这个问题通过谷歌就可以得到不少答案:1、定义一个函数对象并在定义set的时候将其作为第二个模板参数。2、为自定义类型定义<运算符。如:class Edge{public: Edge(int u, int v) : u(u), v(v) { } bool operator < (const Edge& edge) const { return this->u < edge.u; } //为了方便起见设为public int u; int v;};class EdgeComp{pub... 阅读全文
posted @ 2011-12-22 12:51 Shawnone 阅读(14160) 评论(2) 推荐(3) 编辑
摘要: (译注:我想在大多数情况下我会选择直接把Bar声明成Foo的友元。第二个例子倒是挺有意义的。)目的控制对一个类的实现细节的访问颗粒度。动机C++中的友元声明赋予被声明者对一个类的内部的完全访问权限。友元声明因此遭到指责 - 他们破坏了精心打造的封装。C++的友元关系特性没有提供任何可以选择性的对私有成员的一个子集授予权限的方法。友元关系在C++中是一个“所有或者一个也不”的命题。例如,下面的类Foo声明类Bar为其友元。类Bar因此拥有访问类Foo中所有私有成员的权限。这可能不是所期望的,因为它增加了耦合性 - 类Bar不能在没有类Foo的情况下被分发。class Foo{private:vo 阅读全文
posted @ 2011-12-14 23:15 Shawnone 阅读(620) 评论(0) 推荐(0) 编辑
摘要: (译注:请特别注意“警告一节”。多个编译单元的静态变量初始化顺序问题很有可能给你带来奇怪的行为。在很多情况下通过以下方法可以也可以实现类似该惯用法的效果://框架初始化代码//GenerateAppInstance()函数由应用程序员实现//返回已初始化好的要挂接类的指针,智能指针,等等,返回后由框架管理。//这样可以在明确的点进行初始化并且给应用程序员更多初始化的自由。void FrameworkMain(){....App* app= GenerateAppInstance();....}//应用程序员初始化代码void GenerateAppInstance(){App* app = n 阅读全文
posted @ 2011-12-07 00:24 Shawnone 阅读(733) 评论(0) 推荐(2) 编辑
摘要: 目的找到一个一元&运算符被重载的对象的地址。别称动机C++允许针对类重载一元&运算符,被重载的一元&运算符的返回值类型不需要是实际的对象地址。 虽然这样一个类的目的非常值得质疑,但是语言本身是允许这样做的。取址器(Address-of)惯用法是一种可以不用理会被重载的一元&运算符和它的可访问性而取得对象真实地址的方法。在下面的例子中,main函数因为nonaddressable类的&运算符是私有的而不能通过编译。即使该运算符是可以被访问到的,一个从它的返回值类型double到指针的转换也是不可能或者说无意义的。classnonaddressable{pu 阅读全文
posted @ 2011-11-30 23:48 Shawnone 阅读(606) 评论(0) 推荐(0) 编辑
摘要: 译注 - 需要注意的是如果是用VC编译器,直接使用__if_exist关键字就行了,不需要用这种方法:__if_exist(Class::member){//do_something}__if_exist(Class::method){//do_something}目的检测一个特定类成员的存在性。别称动机编译期的反射能力是C++模板元编程的基础。诸如Boost.TypeTraits和TR1 <type_traits> header的类型特征(Type traits)库提供了强大的方法来分离类型和他们的关系的信息。检测一个类的数据成员的存在性也是编译期反射的一个例子。解决方案和示例代 阅读全文
posted @ 2011-11-29 22:41 Shawnone 阅读(733) 评论(0) 推荐(0) 编辑
摘要: 昨天同事问我为什么他的类似下面的代码编译不过(VC2010):classRobbin{};classBatman{private:Robbin&assistant;};编译错误是:error C2512: 'Batman' : no appropriate default constructor available。从错误上来看很明显,编译器没有为Batman隐式生成默认构造函数。但是为什么没有生成呢?一开始没反应过来,几分钟后才想到是引用造成的。但是新的问题又来了,为什么编译错误不是error C2530: 'assistant' : referenc 阅读全文
posted @ 2011-11-26 17:49 Shawnone 阅读(1198) 评论(0) 推荐(0) 编辑