字符串问题

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。

时间: 2024-10-23 04:37:43

字符串问题的相关文章

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

PHP 格式化字符串sprintf()

字符串函数 sprintf() 函数把格式化的字符串写入一个变量中 函数说明:sprintf(格式, 要转换的字符串)  参考PHP手册 返回: 格式化后的字符串 举例: 如:保留2位小数, $str = '99.9';echo sprintf('%01.2f', $str);结果为:99.90 echo round($str, 2); 结果为:99.9

js中字符串的替换

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

SpringMVC后台使用对象接受参数字符串转日期

在springMVC配置文件中加入: <bean id="dateConvert" class="com.iomp.util.DateConvert"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

【自动化__持续集成】___java___字符串转数组

一.代码如下 package www.wujianbotwo; public class Demo08 { public static void main(String[] args) { // TODO Auto-generated method stub String content= "wujianbo,wujianob,33333"; String[] ud= content.split(",");//将字符串分段成一个数组 for(int i=0; i&l

字符串的模式匹配中的算法

字符串的模式匹配是一个比较经典的问题:假设有一个字符串S,称其为主串,然后还有一个字符串T,称其为子串. 现在要做的是,从主串S当中查找子串T的位置,如果存在返回位置值,如果不存在返回-1.另外主串又称为目标串, 子串称为模式串. 暴力匹配算法 这是一个经典的串匹配问题,涉及的算法也比较多,先讨论第一种简单的暴力算法,思路如下 将主串S的第pos个字符 与 子串T的第一个字符比较, 若相同,继续比较子串和主串后面的字符. 若不相同,那么从主串S的第(pos + 1)个字符开始继续向后匹配,直到匹