关于字符串

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

问题

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

思路

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

对于第一题,直接遍历判断是否后一个字符和前一个字符是否相同,这样时间复杂度就会很大,相比于把字符的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. 李洪强漫谈iOS开发[C语言-030]-逻辑运算符

  2. SPRING IN ACTION 第4版笔记-第二章-001-用@Autowired\@ComponentScan、@Configuration、@Component实现自动装载bean

    1. package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.spri ...

  3. eclipse或IDEA连接魅蓝

    1.首先 安装ADB 驱动 http://developer.android.com/tools/device.html 如果没装就自行去下载安装 别的品牌都可以顺利连接,魅族手机特有的原因导至在开发 ...

  4. java.math.BigInteger使用心得总结(转)

    今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换.都会变成0.参考书籍发现使用使用BigInteg ...

  5. 【HDOJ】3832 Earth Hour

    其实就是bfs,不过也可以写成最短路,因为权重为1,可以用Spira解. /* 3832 */ #include <iostream> #include <string> #i ...

  6. 【HDOJ】3726 Graph and Queries

    Treap的基础题目,Treap是个挺不错的数据结构. /* */ #include <iostream> #include <string> #include <map ...

  7. UVA_303_Pipe_(计算几何基础)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page ...

  8. 设计模式(c#)代码总结

    设计模式分为三种类型 创建型模式:简单工厂.工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 行为型模式 ...

  9. Tree HDOJ--2682

    Tree Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 使用jconsole检测linux服务器

    在Jboss中运行run.sh的脚本下添加如下信息: #add by step #start JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxre ...