随笔:78 文章:7 评论:38 引用:0
C++博客 首页 发新随笔
发新文章 联系 聚合管理

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [     ["aa","b"],     ["a","a","b"]   ] 
递归求解所有划分可能~

 1 class Solution {
 2 public:
 3     vector< vector<string> > ans;
 4     
 5     bool IsPalindrome(string s, int start, int end){
 6         if(start==end)
 7             return true;
 8         int i=start, j=end;
 9         while(i<j){
10             if(s[i]!=s[j])
11                 return false;
12             i++;
13             j--;
14         }
15         return true;
16     }
17     void recursivePar(string s, int start, vector<string> par){
18          
19         if(start == s.length()){
20             ans.push_back(par);
21             return ;
22         }
23         for(int i=start; i<s.length(); i++){
24             if(IsPalindrome(s, start, i)){
25                 par.push_back(s.substr(start, i-start+1));
26                 recursivePar(s, i+1, par);
27                 par.pop_back();
28             }
29         }
30             
31         
32     }
33     vector<vector<string>> partition(string s) {
34         // Start typing your C/C++ solution below
35         // DO NOT write int main() function
36         vector<string> par;
37         par.clear();
38         ans.clear();
39         recursivePar(s, 0, par);
40         return ans;
41     }
42 };
posted @ 2013-03-18 22:19 未央 阅读(1481) | 评论 (0)编辑 收藏
 
1. 下载带mingwin 的安装版本 http://www.sudupan.com/down_661789.aspx
2. 进行相关设置 settings-> compilor and debugger...
    1) 最顶区域选择 GNU GCC Compiler (通常是默认的)
    2) 在第二项中找到Tookchain executables选项,compiler's installation directory, 选择编译器的安装路径,如C:\ProgramFiles\CodeBlocks\MinGW 
3. OK了









posted @ 2012-11-08 08:14 未央 阅读(323) | 评论 (0)编辑 收藏
 
转载自:
http://hi.baidu.com/jmlover/blog/item/5ba6d53f535ddcc27d1e719c.html

Firefox 键盘快捷键
导航类
后退: Alt+左方向键 或  Backspace
前进: Shift+Backspace 或  Alt+右方向键
首页:  Alt+Home
打开文件: Ctrl+O
重新载入: F5 或  Ctrl+R
重新载入 (忽略缓存): Ctrl+F5 或  Ctrl+Shift+R
停止: Esc

当前页
到页面底部: End
到页面顶部: Home
移到下一帧: F6  
移到上一帧: Shift+F6
页面源代码: Ctrl+U
打印: Ctrl+P
页面另存为: Ctrl+S
放大文字: Ctrl++
缩小文字: Ctrl+-
恢复文本大小: Ctrl+0
 
编辑
复制: Ctrl+C
剪切: Ctrl+X
删除: Del
粘贴: Ctrl+V
重做: Ctrl+Y
全选: Ctrl+A
撤消: Ctrl+Z
 
搜索
本页查找: Ctrl+F
再次查找: F3
输入查找链接: '
输入查找文本: /
查找: Shift+F3
网页搜索: Ctrl+K 或  Ctrl+E
 
窗口和标签
关闭标签: Ctrl+W 或  Ctrl+F4
关闭窗口: Ctrl+Shift+W 或  Alt+F4
向左移动标签: Ctrl+左方向键 或  Ctrl+上方向键
向右移动标签: Ctrl+右方向键 或  Ctrl+下方向键
移动标签到开头: Ctrl+Home
移动标签到结尾: Ctrl+End
新建标签页: Ctrl+T
新建窗口: Ctrl+N
下一个标签页: Ctrl+Tab 或  Ctrl+PageDown
在新标签页打开网址: Alt+Enter
前一个标签页: Ctrl+Shift+Tab 或  Ctrl+PageUp
撤销关闭标签页: Ctrl+Shift+T
选择标签页 [1 to 8]: Ctrl+[1 到 8]
选择最后标签页: Ctrl+9
 
工具
添加所有为书签: Ctrl+Shift+D
添加当前为书签: Ctrl+D
打开书签: Ctrl+B 或  Ctrl+I
插入浏览: F7
下载: Ctrl+J
历史: Ctrl+H
清除私有数据: Ctrl+Shift+Del
 
其他
补全 .com 地址: Ctrl+Enter
补全 .net 地址: Shift+Enter
补全 .org 地址: Ctrl+Shift+Enter
删除选定的自匹配输入: Del
全屏: F11
选择地址条: Alt+D 或  F6 或  Ctrl+L
选择或管理搜索引擎: Alt+上方向键 或  Alt+下方向键 或  F4

Firefox 鼠标快捷键

后退: Shift+Scroll down
关闭标签页: 在标签上按鼠标中键
减小文字大小:  Ctrl+Scroll up
前进:  Shift+Scroll up
增大文字大小:  Ctrl+Scroll down
新建标签页:  在标签页栏双击鼠标     
在后台打开标签页:  Ctrl+Left-click 或  点击鼠标中键     
在前台打开标签页:  Shift+Ctrl+Left-click 或  Shift+点击鼠标中键     
在新窗口打开: Shift+Left-click
刷新 (覆盖缓存): Shift+Reload button     
保存页面为:  Alt+Left-click     
逐行滚动:  Alt+Scroll
posted @ 2012-07-09 12:05 未央 阅读(208) | 评论 (0)编辑 收藏
 
http://download.csdn.net/detail/mobilerit/823506 
好用
posted @ 2012-06-10 10:08 未央 阅读(667) | 评论 (0)编辑 收藏
 
QSplitter  的函数中有addWidget,但是却没有removeWidget, 或者delete之类的功能,所以如果想删去或者暂时不显示其中的某些widget就要自己手动完成这个效果。
方法一:
取出想删除的widget,删除它的指针,QSplitter找不到这个widget的地址,就会自动清除这个widget。
QWidget *w = new QWidget();
splitter->addWidget(w);
QWidget *a = splitter->widget(0);
delete a;
a = NULL;
但是这个方法存在一个问题,删除指针a,意味着w所指向的地址也被删除了,如果你想再次把w add到splitter中,就会出现内存访问冲突之类的错误,因为w所指向的widget已经被delete掉了。
这个方法的好处是真正把一个widget从 splitter里面移除了,而且连带原本的widget也释放了。

方法二:
QWidget中有一个函数.hide();它相当于把一个widget设为不可见setVisible(false);想要恢复它也很容易,setVisible(true)即可。
QWidget *w = new QWidget();
splitter->addWidget(w);
QWidget *a = splitter->widget(0);
a.hide();
这样就可以达到看上去像删除了splitter中一个widget的效果。但其实这个widget还在splitter中。如果想让它再出现,就设置a.setVisible(true);
此方法不会释放w,因而适合反复调整splitter中可见widget的功能。
posted @ 2012-02-10 10:35 未央 阅读(2737) | 评论 (0)编辑 收藏
 
转自: http://hi.baidu.com/yangjinbo/blog/item/02e87209a38066a42eddd4ae.html 

一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况.

<!--[if !vml]--><!--[endif]-->

从上图可知,程序占用的内存被分了以下几部分.

1、栈区(stack

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存.

2、堆区(heap

一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收.类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放.

3、全局区(静态区)(static

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放

4、文字常量区

常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区

存放函数体的二进制代码。

先看一个例子.

char c; //栈上分配
char *p = new char[3]; //堆上分配,将地址赋给了p;

在 编译器遇到第一条指令时,计算其大小,然后去查找当前栈的空间是大于所需分配的空间大小,如果这时栈内空间大于所申请的空间,那么就为其分配内存空间,注 意:在这里,内在空间的分配是连续的,是接着上次分配结束后进行分配的.如果栈内空间小于所申请的空间大小,那么这时系统将揭示栈溢出,并给出相应的异常 信息.

编译器遇到第二条指令时,由于p是在栈上分配的,所以在为p分配内在空间时和上面的方法一样,但当遇到new关 键字,那么编译器都知道,这是用户申请的动态内存空间,所以就会转到堆上去为其寻找空间分配.大家注意:堆上的内存空间不是连续的,它是由相应的链表将其 空间区时的内在区块连接的,所以在接到分配内存空间的指定后,它不会马上为其分配相应的空间,而是先要计算所需空间,然后再到遍列整个堆(即遍列整个链的 节点),将第一次遇到的内存块分配给它.最后再把在堆上分配的字符数组的首地址赋给p.,这个时候,大家已经清楚了,p中现在存放的是在堆中申请的字符数组的首地址,也就是在堆中申请的数组的地址现在被赋给了在栈上申请的指针变量p.为了更加形象的说明问题,请看下图:

<!--[if !vml]--><!--[endif]-->

从上图可以看出,我们在堆上动态分配的数组的首地址存入了指针p所指向的内容.

请 注意:在栈上所申请的内存空间,当我们出了变量所在的作用域后,系统会自动我们回收这些空间,而在堆上申请的空间,当出了相应的作用域以后,我们需要显式 的调用delete来释放所申请的内存空间,如果我们不及时得对这些空间进行释放,那么内存中的内存碎片就越来越多,从而我们的实际内存空间也就会变的越 来越少,即,孤立的内存块越来越多.在这里,我们知道,堆中的内存区域不是连续的,还是将有效的内存区域经过链表指针连接起来的,如果我们申请到了某一块 内存,那么这一块内存区将会从连续的(通过链表连接起来的)内存块上断开,如果我们在使用完后,不及时的对它进行释放,那么它就会孤立的开来,由于没有任 何指针指向它,所以这个区域将成为内存碎片,所以在使用完动态分配的内存(通过NEW申请)后,一定要显式的对它进行DELETE删除.对于这一点,一定 要切记...

上面给大家陈述了它们之间的概念,对于它们俩的使用比较方面,这里我就不能大家断续陈述了,对于这个问题,网上一网友的文章中阐述的比较详细,而且附带了专业的色彩,下面的文章是部分片断.

申请大小的限制

栈:在Windows,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";
char
 *s2 = "bbbbbbbbbbbbbbbbb";

aaaaaaaaaaa是在运行时刻赋值的;

bbbbbbbbbbb是在编译时就确定的;

但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

比如:

void main()
{

    char
 a = 1;
    char
 c[] = "1234567890";
    char
 *p ="1234567890";
    a = c[1];
   a = p[1];
    return
;
}

对应的汇编代码

10: a = c[1];

00401067
 8A 4D F1 mov cl,byte ptr [ebp-0Fh]

0040106A 88 4D FC mov byte ptr [ebp-4],cl

11
: a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

00401070
 8A 42 01 mov al,byte ptr [edx+1]

00401073 88 45
 FC mov byte ptr [ebp-4],al

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

小结:

堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度


posted @ 2012-02-03 15:52 未央 阅读(505) | 评论 (0)编辑 收藏
 
sprintf(name, "%d", n); 把整数n转化成字符串,写到char name[10]里。
posted @ 2011-12-04 22:36 未央 阅读(301) | 评论 (1)编辑 收藏
 
原文链接:http://hi.baidu.com/magical/blog/item/d926d0c8d840311b7e3e6fdb.html     
微软发布了最新的 Visual Studio 2010 软件开发编程平台及 .Net Framework 4 框架。这次 VisualStudio 2010 包括 Professional 专业版、Premium 白金版、Ultimate 旗舰版、Test Professional 测试专业版等版本。       
Visual Studio 2010
 支持64位Windows,支持多显示器,以便您可以根据自己的需要来组织和管理工作。您还可以通过可视化设计器来充分发挥您的创造力。无论您的项目简单 还是复杂,您都可以使用VS2010将您的理 念变成现实!

提供一枚可供使用的KEY:YCFHQ9DWCYDKV88T2TMHG7BHP

如果你是在官方下载的试用版,请按照下面的方法升级成正式版,安装后,进入控制面板的添加删除程序,点“卸载VS2010”后,在弹出的窗口中有个Update Key的框,输入注册码就OK了。
也可以使用UltraISO编辑了下 ISO文件,将Setup-->setup.sdb文件提取出来编辑,将
[Product Key]
YR3W8FCM2B7BKF9HMQFTCH7WK
改成
[Product Key]
YCFHQ9DWCYDKV88T2TMHG7BHP
这样安装后就是正式版了。

注意:如果你是使用我下面提供的地址下载的VS2010,那你不需要修改KEY了,直接安装就是正式版了。

VS2010中文旗舰(MSDN)版下载地址
ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/

Visual Assist X 10.6.1823下载地址
: 
For Visual Studio 2008/2005/.NET/VC6版本 
Visual Studio 2010版
10.6.1823破解补丁

补丁使用说明
1、对于VS2008及以前的版本来说,直接用破解补丁覆盖安装目录下的VA_X.DLL文件即可。
2、VS2010版是以VS2010插件的方式安装的,插件是一个扩展名为vsix的文件,实质上是一个zip的压缩包,只需将VA_X_Setup1823.vsix文件名加上zip的扩展名,然后用winrar打开,用补丁包中的va_x.dll替换其中的同名文件,再将扩展名改回vsix安装即可。

VS2010插件版卸载说明打开VS2010的菜单,在工具(Tools) - 扩展管理(Extension Manager)中找到插件,点击卸载。
posted @ 2011-11-27 16:14 未央 阅读(1271) | 评论 (0)编辑 收藏
 
#include<iostream>
#include
<io.h>
using namespace std;
int main(){
    _finddata_t file;
    
long lf;
    
//输入文件夹路径
    if((lf = _findfirst("C:\\VisFiles\\Thelayout.Pick3\\*.thelayout"&file))==-1)
        cout
<<"Not Found!"<<endl;
    
else{
        
//输出文件名
        cout<<"file name list:"<<endl;
        
while(_findnext( lf, &file)==0){
            cout
<<file.name<<endl;
        }
    }
    _findclose(lf);
    
return 0;
}
posted @ 2011-11-22 21:54 未央 阅读(5015) | 评论 (2)编辑 收藏
 
(1) (a+b)%c = ((a%c)+(b%c))%c; 
(2) (a*b)%c = ((a%c)*(b%c))%c;
Proof:
(1) suppose a=m*c+n, b=s*c+t;
     (a+b)%c = ((m*c+n)+(s*c+t))%c = ((m+s)*c+(n+t))%c = ((m+s+k)*c+q)%c = q = (k*c+q)%c = (n+t)%c.
     (a+b)%c = ((m*c+n)+(s*c+t))%c = ((m*c+n)%c+(s*c+t)%c)%c=(n+t)%c.
     so (a+b)%c = ((a%c)+(b%c))%c;
(2) suppose a=m*c+n, b=s*c+t;
     (a*b)%c = ((m*c+n)*(s*c+t))%c = (m*s*c*c+(mt+sn)*c+n*t)%c = ((m*s*c+(mt+sn)+k)*c + q)%c = q = (k*c+q)%c = (n*t)%c.
     (a*b)%c = ((m*c+n)%c *(s*c+t)%c)%c = (n*t)%c.
     so (a*b)%c = ((a%c)*(b%c))%c;

有了上面两个性质,让我们来看一道题目。给定一个数n(n<10^100), 求 n%145 (char *n);
n[0], n[1], n[2] ... n[length-1].
n=n[0]*10^(length-1) + n[1]*10^(length-2) + ... + n[length-1]. (由于n是字符串,都需要-'0',为了简便不写了)。
在生成n的时候每一步都取余145.
int ans=0;
for(int i=0; i<length; i++)
    ans = (ans*10+n[i])%145;
再来看经典的 快速幂取模 算法:
a^b%n 
 long long  modExp(long long  a,long long  b,long long  n){
    long long  t,y;
    t = 1; y = a;
    while(b){
        if(b % 2) t = t * y % n;
        y = y * y % n;
        b >>= 1;
    }
     return t;
}
posted @ 2011-08-03 23:14 未央 阅读(2419) | 评论 (2)编辑 收藏
仅列出标题
共8页: 1 2 3 4 5 6 7 8 
CALENDER
<2011年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(6)

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


Powered By: 博客园
模板提供沪江博客