字符串问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串问题相关的知识,希望对你有一定的参考价值。

1.多型数据类型是指包含的数据元素的类型并不确定。

比如栈可以是整数栈、字符栈、对象栈等等。

但是字符串,它的元素必然是字符。


2.两个长度不相同的串不可能相等。

先判断长度是否相等,不相等则结果直接为不相等;

长度相等才继续判断是否对应位置上的每个字符串是否相等,如果所有对应位置字符都相等,结果为相等,否则为不相等。


3.在64位平台机器下sizeof(string_a),sizeof(string_b)大小分别是

  1.char *string_a=(char *)malloc(100*sizeof(char));     8

  2.char string_b[100];             100

  

串′ababaaababaa′的next数组为011234223456。

   i     0    1    2    3    4    5   6   7    8   9   10  11

   s     a    b    a    b    a    a   a   b    a   b   a    a  

next[i]   -1   0    0   1     2    3   1   1    2    3   4    5

先计算前缀next[i]的值: (字符串匹配是 从头开始的 和 从尾开始的字符串进行匹配是否重复 )

next[i]的值主要是看s[i]之前的字符串中重复的子串长度。next[0] = -1,定值。  

next[1]是看s[1]之前的字符串“a”中重复的子串长度为0,故next[1] = 0。

next[2]是看s[2]之前的字符串“ab”中重复的子串长度为0,故next[2] = 0。

next[3]是看s[3]之前的字符串"aba"中重复的子串长度,s[0]与s[2]重复,长度为1,故next[3] = 1。

next[4]是看s[4]之前的字符串"abab"中重复的子串长度,s[01]与s[23]重复,长度为2,故next[4] = 2。

next[5]是看s[5]之前的字符串"ababa"中重复的子串长度,s[012]与s[234]重复,长度为3,故next[5] = 3。

next[6]是看s[6]之前的字符串"ababaa"中重复的子串长度,s[0]与s[5]重复(因为多了一个a,无法找到长度为3的重复字符串,

这只能是s[0]和s[5]重复),长度为1,故next[6] = 1。

同样的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分别为1和2、3、4、5。


next数组下标从1开始计算

next[1] 肯定是 0 

next[2] 肯定是 1

next[n] 的情况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

举例:

next[6]的计算,字符串第六位是 a ,( ababa a ababaa)

将前面的5个字符,从头尾开始取4个组成子串比较,如果不相等,则从首尾取3个字符组成子串继续比较,并以此类推, 

如果一直比较到最后一个字符都不相等,那么该next值为1。

4个字符的情况:abab : baba

3个字符的情况:aba   :  aba  此时相等,那么next[6] = 3+1 = 4


4.字符串www.qq.com所有非空子串(两个子串如果内容相同则只算一个)个数是50

非空子串的个数共有n(n+1)/2=55个,由于相同子串算一个,所以要减去2个w,一个.,一个ww,一个q,所以还有50个。

要求的是子串,从左到右一次截取, 10个字符的子串,1个; 9个字符的子串,2个; 

8--------3个, 7---------4个, ......... 1-----------10个 

共有:1+2+3+...+10=10*(10+1)/2=55 

减去重复的: 1个字符时有3个w,2个q,2个. 2个字符时有2个ww 故应减去:(2+1+1+1)=5 答案:55-5=50。


5.设栈的初始状态为空,当字符序列a3_作为栈的输入时,输出长度为3的且可以用作C语言标识符的字符串序列有3个。

分别是:a3_.a_3,_3a.

首先,栈的顺序是先进后出

字符序列为a3_   1)a入栈,再出栈,然后3入栈,再出栈,—入栈,再出栈   序列是a3_

                           2)a入栈,再出栈,然后3,—入栈,再出栈,序列是a_3

                           3)a入栈,3入栈,再出栈,a出栈, —入栈,再出栈   序列是3a_

                           4) a入栈,3入栈,再出栈, —入栈,序列是3_a

                           5) a入栈,3入栈,_入栈,序列是_3a

其次,C语言的标识符不能以数字开头,去除3a_和3_a   答案为3。


6.String str = new String(“abc”),“abc”在内存中的分配是堆,字符串常量区。

当你new String("abc")时,其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,

然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区。


7."abc"+"def"则会创建三个字符串对象,第三个是"abcdef"。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。

StringBuffer是线程安全的,它比String快。 1、三者执行速度:StringBuilder > StringBuffer > String ;

2、StringBuilder:线程非安全的;

3、StringBuffer:线程安全的;

4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;

(1)String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;

(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象; 所以,当改变字符串的内容时,StringBuffer能获得更好的性能;

(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;


8.中缀表达式(a+b)*c*(d-e/f) 转成后缀  ab+c*def/-*。

中缀表达式转后缀表达式的方法:

1.遇到操作数:直接输出(添加到后缀表达式中)

2.栈为空时,遇到运算符,直接入栈

3.遇到左括号:将其入栈

4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。

5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈

6.最终将栈中的元素依次出栈,输出。


9.串是一种特殊的线性表,其特殊性体现在数据元素是一个字符.

串就是字符串,是一种特殊的线性表,它的每个结点仅由一个字符组成。

串值也可用链表来存储,由于串的数据元素是一个字符,它只有8位二进制数, 因此用链表存储时,通常一个结点中存放的不是一个字符,而是一个子串,例如: 在编辑系统中,整个文本编辑区可以看成是一个串,每一行是一个子串,构成一个结点。


10.字符串通常采用的两种存储方式是顺序存储和链式存储.

顺序存储和链式存储时两种最基本的存储结构,字符串通常采用顺序存储,但是字符串较长而没有那么大的连续空间时,可以把一个字符串分成多个小串,串与串之间采用链式存储.


11.串的长度:串中字符数目 n 称为串的长度;串长度是指串中所有字符的个数。

零个字符的串称为空串,长度为零。


12.在C语音中有:

string 和 int 型都支持直接加减

‘C‘+‘8‘-‘3‘= ‘C‘+‘5‘,由于‘C‘+1=‘D‘,所以结果为char ‘H‘ => %c;

‘9’-‘0’:平时写代码的时候经常int(0~9)转换char就用的+‘0‘,因此结果直接就是int 9 => %d。


本文出自 “学虽易学好难且学且珍惜” 博客,请务必保留此出处http://lhf20132175.blog.51cto.com/11029145/1889565

以上是关于字符串问题的主要内容,如果未能解决你的问题,请参考以下文章

字符串问题之 字符串的统计字符串

C++字符串的问题

在字符串中查找多个子字符串时遇到问题

字符串置换问题

提取带有字符串引用问题的字符串 pl sql

字符串距离问题