数据结构与算法
来源:互联网 发布:五金小助手软件 编辑:程序博客网 时间:2024/06/07 07:31
数据结构与算法 - 两个指针搞定字符串操作
在笔试、面试中经常出现对字符串的操作,所以对于字符串的常用操作要熟练掌握。同时也要牢固掌握字符串的基本操作。
在C语言中,可以通过如下的方式来声明字符串:
1、char *str="字符串";// 字符常量
- # include <stdio.h>
- # include <math.h>
- void DelSpace(char *s){
- if(s == NULL) return;
- int flag = 0 ;
- if(*s == ' ') flag = 1;
- char *p = s;
- int j = 0;
- while(*p != '\0'){
- if(*p != ' ')
- s[j++] = *p;
- else{
- while(*p == ' '){
- p++;
- }
- // 在首或尾的地方不需要再加入空格,p++可能导致这里的p指向'\0'
- if(flag==1 || *p=='\0'){
- flag = 0;
- }else{
- s[j++] = ' ';
- }
- p--;//方便外层的p++做处理
- }
- p++;
- }
- s[j] = '\0';
- }
- int main(){
- char str[]=" dddd psdf dd ";
- DelSpace(str);
- printf("%s",str);
- }
将一个字符串左边的n个字符移动到右边即左旋字符串。解决的思路非常多,但是有一个方法感觉比较好。首先想一下,如果要将一个字符串反转,你会怎么做?
(1)设两个指针,一个指向字符串开头start,一个指向字符串末尾end,然后交换指针的值。
(2)start加1,而end减1,直到start>=end为止。
代码如下:
- char * invert(char *start, char *end) {
- char tmp, *ptmp = start;
- while (start != NULL && end != NULL && start < end){
- tmp = *start;
- *start = *end;
- *end = tmp;
- start ++;
- end --;
- }
- return ptmp;
- }
下面来反转字符串。将一个字符串分成两部分,X和Y两个部分,在字符串上定义反转的操作X^T,即把X的所有字符反转(如,X="abc",那么X^T="cba"),那么我们可以得到下面的结论:(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。
不是么?ok,就拿abcdef 这个例子来说,若要让def翻转到abc的前头,那么只要按下述3个步骤操作即可:
1、首先分为俩部分,X:abc,Y:def;
2、X->X^T,abc->cba, Y->Y^T,def->fed。
3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。
如下图所示。
具体的实现代码如下:
- char *left(char *s, int pos) //pos为要旋转的字符个数,或长度,下面主函数测试中,pos=3。
- {
- int len = strlen(s);
- invert(s, s + (pos - 1)); //如上,X->X^T,即 abc->cba
- invert(s + pos, s + (len - 1)); //如上,Y->Y^T,即 def->fed
- invert(s, s + (len - 1)); //如上,整个翻转,(X^TY^T)^T=YX,即 cbafed->defabc。
- return s;
- }
3、求最长回文子串
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。输入字符串长度大于等于1小于等于5000。
由于相同字母组成的一定是回文子串,如a,aa,aaaa,所以在遍历字符串字符时,直接找第i个元素(图中浅绿n)左右两边与该字符不相同的字符,并用两个指针pre和post指向。如下图。
这样就可以将pre--,post++,然后比较*pre和*post的值。如果相等,继续pre--,post++(在操作时注意pre和post的边界条件);如果不相等,记录并更新回文子串的长度即可。
代码如下:
- #include <iostream>
- #include <cstdio>
- using namespace std;
- char *x;
- int length=0;
- void findCircle(char *str){
- if(str==NULL) return;
- char *pre=NULL,*post=NULL;
- for(str; *str!='\0'; str++){
- pre=str;post=str;
- while(*(post+1)!='\0'&&*(post+1)==*str) post++;
- while(*(pre-1)!='\0'&&*(pre-1)==*str) pre--;
- while( pre-1!=NULL&&post+1!=NULL&& (*(pre-1)==*(post+1)) ){
- pre=pre-1;
- post=post+1;
- }
- if(post-pre+1>length) {
- length=post-pre+1;
- x=pre;
- }
- }
- for(int i=0;i<length;i++){
- cout<<*(x++)<<" ";
- }
- }
- int main(){
- char *str;
- gets(str);
- findCircle(str);
- return 0;
- }
参考博客July
- 上一篇Java 7之多线程第3篇 - 笔试、面试常见线程问题
- 下一篇送给前线码农的话 - 大牛们的经典语录
- 顶
- 2
- 踩
- 0
- 数据结构与算法 -- 算法
- 【数据结构与算法】浅谈数据结构与算法
- 【数据结构与算法】【Some】数据结构与算法
- 数据结构笔记-----数据结构与算法
- 【数据结构与算法】数据结构备忘
- 数据结构与算法总论
- 数据结构与算法总论
- 数据结构与算法基础
- 数据结构与算法总论
- 数据结构与算法
- 数据结构与算法基础
- 数据结构与算法笔记
- 数据结构与算法
- 数据结构与算法
- 数据结构与算法
- 算法与数据结构简介
- 数据结构与算法
- 数据结构与算法(1)
- awk
- 求逆序数的三种数据结构比较
- STL算法归类
- 安装TortoiseGit 状态图标不能正常显示
- intellij idea常用设置
- 数据结构与算法
- 2010成都站J题 ||hdu 3718 二分图的最佳匹配 =〉 最小费用最大流
- sendBroadcastAsUser——Calling a method in the system process without a qualified user
- LeetCode——4Sum
- Lession 30 异常处理
- php xmlsimpleelement 解析xml
- 远程连接服务器For Windows 2003 & 2008
- ITEXT 用java写pdf文档
- java和c/c++的区别