关于字符串

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

问题

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

思路

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

对于第一题,直接遍历判断是否后一个字符和前一个字符是否相同,这样时间复杂度就会很大,相比于把字符的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. 【HDOJ】1180 诡异的楼梯

    bfs+优先队列.wa了N次,才发现可以停留等待楼梯变换方向. #include <iostream> #include <queue> #include <cstdio ...

  2. oracle查询转换_inlist转换

    oracle的optimizer会对一些sql语句进行查询转换,比如: 合并视图 子查询非嵌套化 inlist转换 下面讲讲遇到的in list转化优化的案例: create table test( ...

  3. 【session】

    users.json { "tobi": { "password": "ferret", "name": "T ...

  4. 在Windows Azure公有云环境部署企业应用

    作者 王枫 发布于 2014年4月5日 企业内部应用转换为在线服务 Windows Azure已经成为众多IT服务提供商们热议的话题,其中,有的认为只有提供互连网用户服务的应用才适合放在公有云环境内运 ...

  5. xcode duplicate symbol _GAD_MD5 解决方法

    添加了mobi的广告平台后,在Device状态打包时,出现此错误. duplicate symbol _GAD_MD5 in: 解决方法: Targets ->Build Setting  中设 ...

  6. Climbing Worm

    Climbing Worm Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. SQLServer的ISNULL函数和Mysql的IFNULL函数

    SQL Serve的ISNULL函数: ISNULL(check_expression,replacement_value) 1.check_expression与replacement_value的 ...

  8. 通过修改 Apache 的配置文件 htaccess 文件实现自定义404页面

    最近在学习使用Apache服务器的配置,做一个记录. Apache下有个.htaccess文件,是Apache的一个特殊的配置文件.这个配置文件默认是没有的,要手动在各自的项目的根目录编写才行. 要实 ...

  9. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  10. OpenCL memory object 之 传输优化

    转载自:http://www.cnblogs.com/mikewolf2002/archive/2011/12/18/2291741.html 首先我们了解一些优化时候的术语及其定义: 1.defer ...