关于字符串

问题描述:一般这类程序设计的题目较简单,通过设计字符串的反转,寻找子串,以及字符串的拼接、删除操作等问题。

问题

  • 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复)?
  • 设计算法并写出代码移除字符串中重复的字符(不能使用额外的缓存空间)?
  • 写一个函数判断两个字符串是否是变位词?

思路

这三个题目,几乎都要对字符串进行遍历,在遍历中寻求一些逻辑上的计算。

对于第一题,直接遍历判断是否后一个字符和前一个字符是否相同,这样时间复杂度就会很大,相比于把字符的Ascll码直接作为数组的下标,是个不错的选择,这样大大提高了时间效率,不过需要借助一些额外的内存空间。

对于第二题,由于不可以使用额外的缓存空间,则就考虑直接把重复的字符设置标志,然后把没有设置标志的字符输出来,就能达到最后的效果。

对于第三题,需要遍历字符串,统计重复的字符,也可以把他作为一个数组的下标,这样两个额外的数组里的值相同,即就是“变位词”,不同就不是;或者将每个字符串,排序,如果相同,则是“变位词”,如果不同,则不是“变位词”。

需要注意的是:在运用到"char"数组的时候不要忘记了,最后位置上的结束符"\n"。还有就是声明的一个数组,最好事先初始化

主要代码

1、判断字符串中字符是否唯一

//O(n*n)
bool isUnique(string str)
{
int i, j;
int length = str.length();
for (i = 0; i < length; i++)
{
for (j = i + 1; j < length; j++)
{
if (str[i] == str[j])
{
return false;
break;
}
}
}
if (j == length) return true;
} //O(n)
bool isUnique1(string str)
{
int v;
bool s[256];
//初始化比较大的数组
memset(s, 0, sizeof(s));
int length = str.length();
for (int i = 0; i < length; i++)
{
v = (int)(str[i]);
if (s[v])
{
return false;
}
s[v] = true;
}
return true;
}

2、移除重复字符

void removeDuplicate(char s[])
{
int length = strlen(s);
int i, j;
for (i = 0; i < length; i++)
{
for (j = i + 1; j < length; j++)
{
if (s[i] == s[j])
{
s[j] = ' '; //空格的ascll为32
}
} if (s[i] != ' ')
{
cout << s[i];
}
} cout << endl;
}

3、字符串是否是变位词

bool isAnagrams1(string a, string b)
{
if (a == " " || b == " ")
{
return false;
}
if (a.length() != b.length())
{
return false;
}
if (a == b)
{
return false;
}
//sort
sort(&a[0], &a[0] + a.length());
sort(&b[0], &b[0] + b.length()); if (a == b)
{
return true;
}
else
return false;
} bool isAnagrams2(string a, string b)
{
int c[256];
memset(c, 0, sizeof(c)); if (a == "" || b == "")
{
return false;
} if (a.length() != b.length())
{
return false;
} if (a == b)
{
return false;
} for (int i = 0; i < a.length(); i++)
{
c[(int)a[i]] += 1;
c[(int)b[i]] -= 1;
} for (int i = 0; i < 256; i++)
{
if (c[i] != 0)
{
return false;
break;
}
} return true;
}

Note:本文一些思路及题目翻译摘自于http://www.hawstein.com/

Cracking the coding interview-String的更多相关文章

  1. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  2. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  3. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  4. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  5. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  6. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

  7. Cracking the Coding Interview 题目分析笔记—— Array and String

    1.Determine if a string has all unique characters learn: 为了减少空间利用率,其比较优秀的算法一般都适用位操作 返回值的命名方法,我们需要学习 ...

  8. Cracking the Coding Interview(String and array)

    1.1实现一个算法判断一个字符串是否存在重复字符.如果不能利用另外的数据结构又该如何实现? My solution: /** *利用类似一个hash table的计数 *然后检查这个hash tabl ...

  9. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

  10. CRACKING THE CODING INTERVIEW 笔记(1)

    1. Arrays and Strings 1.1 Hash Tables 哈希表,简单的说就是由一个数组和一个hash函数组成实现key/value映射并且能高效的查找的数据结构.最简单的想法就是将 ...

随机推荐

  1. asp.net 登陆后在ashx处理程序中获取不到Session

    登录后存储Session,另一个页面Ajax请求 ashx页面,发现无法获取到Session,Session is NULL  使用“IReadOnlySessionState”这个接口就可以

  2. [转贴] C++内存管理检测工具 Valgrind

    用C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind正好就是这样的一 ...

  3. Qt源码分析之QPointer

    QPointer是一个指针封装类,其作用类似于智能指针,但是它最大的特点应该是在指针的控制上,它希望一个Qt的指针(当然是从QObject派生的)可以同时被多个类拥有,这在界面编程中当然是很常见的事情 ...

  4. C# 读取网络txt文件 并写在本地txt文件中

    public void WriteStream() { try { stirng ImagesPath = ImagesPath + "\\2013-09-27.txt"; Htt ...

  5. 转: 二十八、Java图形化界面设计——中间容器(Jpanel)

    http://blog.csdn.net/liujun13579/article/details/7762835 上一篇讲解了Jframe顶层容器,例子中生成了一个空的窗体,在实际编程过程中,一般很少 ...

  6. BlockingQueue-线程的阻塞队列

    BlockingQueue作为线程容器,可以为线程同步提供有力的保障,其主要用到的方法包括: add(E o); //将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 ...

  7. Uncompressing Linux___ done, booting the kernel_tekkamanninja-ChinaUnix博客

    今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题: MIN ...

  8. poj2154

    利用bzoj2705的结论我们很容易优化这道等价类计数的问题 sum(n^gcd(i,n))/n mod p (1<=i<=n) =sum(phi(n/L)*n^L)/n mod p (n ...

  9. 【转】EditText获取焦点不自动弹出键盘设置--失去焦点的方法,不错

    原文网址:http://zouhuajian01.blog.163.com/blog/static/1176987720121128115813176/ 当我们在activity中加入EditText ...

  10. linux下用Apache一个IP多个网站多域名配置方法

    如有两个域名,分别是desk.xker.com和tool.xker.com,需把这两个域名都绑定到IP是219.13.34.32的服务器上 1.首先需在域名供应商管理页面指定域名和IP的对应关系 2. ...