字符数组

KMP算法的next[]数组通俗解释

一曲冷凌霜 提交于 2020-02-20 02:10:49
KMP算法的next[]数组通俗解释 我们在一个母字符串中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。 这个next数组的求法是KMP算法的关键,但不是很好理解,我在这里用通俗的话解释一下,看到别的地方到处是数学公式推导,看得都蛋疼,这个篇文章仅贡献给不喜欢看数学公式又想理解KMP算法的同学。 1、用一个例子来解释,下面是一个子串的next数组的值,可以看到这个子串的对称程度很高,所以next值都比较大。 位置i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 前缀next[i] 0 0 0 0 1 2 3 1 2 3 4 5 6 7 4 0 子串 a g c t a g c a g c t a g c t g 申明一下:下面说的对称不是中心对称,而是中心字符块对称,比如不是abccba,而是abcabc这种对称。 (1

java基础加强

陌路散爱 提交于 2020-02-17 22:57:44
java程序的执行过程 编写java程序 编写完的java程序,进行保存时自动将.java文件编译成.class文件 先启动虚拟机,虚拟机加载字节码对象.class文件,进行这个类的main方法开始执行 数据类型 基本数据类型 类型 描述 byte 占1个字节,范围-127-128,-2 7 到2 7 -1 short 占2个字节,范围-2 15 到2 15 -1 int 占4个字节,范围-2 31 到2 31 -1 long 占8个字节,范围-2 63 到2 63 -1 float 占4个字节,单精度 double 占8字节,双精度度 char 占2字节 boolean 占1字节 引用数据类型 基本类型的字面值规则 整数的字面值是int类型 byte、short、char三种比int小的整数,可以用范围内的值可以直接赋值 浮点数字字面值,是double类型 字面值的后缀:L表示long,F表示float,D表示double类型 字面值的前缀:0b表示二进制,0表示八进制,0x表示十六进制,\u表示char16机制 基本类型的运算规则 计算结果的数据类型,和算项的最大类型保持一致 byte、short、char三种比int小的整数,运算时自动转化成int 整数运算溢出 浮点数计算不精确 浮点数的特殊值: Java基础 1.验证JDK是否安装成功的命令: Echo %JAVA

FileInputStream/FileOutputStream

这一生的挚爱 提交于 2020-02-17 10:23:59
这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象); 本地文件读写编程的基本过程为: ① 生成文件流对象(对文件读操作时应该为FileInputStream类,而文件写应该为FileOutputStream类); ② 调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等)读写文件内容; ③ 关闭文件(close())。 实例:流文件读写 流文件的单元是字节,所以它不但可以读写文本文件,也可以读写图片、声音、影像文件,这种特点非常有用,因为我们可以把这种文件变成流,然后在网络上传输。 问题是有了通用的流文件以后,为什么还要专门的字符流呢?这是因为文本可以用不同的方式存储,可以是普通的文本(UTF-8编码方式),ASCII文本和Unicode文本,字符流对象可以进行必要的转换,从而读出正确的文本。 有人认为流文件不能读写文本文件,这其实是个误会,因为文本文件本质上也是由字节组成的,当然是流文件的一种。作为读写文件的全体,这是没问题的,但是,如果要处理每次读入的内容,就最好使用字符流。 所以在文本文件处理时,使用字符流是个最常用的方法。 样例: import java.io.*; public class

字节流、字符流

北战南征 提交于 2020-02-17 06:59:52
一、IO概述 1.1 什么是IO 把数据的传输,看做是一种数据的流动,按照流动的方向, 以内存为基准 ,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。 Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。 1.2 IO的分类 根据数据的流向分为:输入流和输出流。 输入流 :把数据从 其他设备 上读取到 内存 中的流。 输出流 :把数据从 内存 中写出到 其他设备 上的流。 根据数据的类型分为:字节流和字符流。 字节流 :以字节为单位,读写数据的流。 字符流 :以字符为单位,读写数据的流。 1.3 顶级父类 输入流 输出流 字节流 字节输入流 InputStream 字节输出流 OutputStream 字符流 字符输出流 Reader 字符输出流 Writer 二、字节流 2.1 一切皆为字节 一切文件 数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以, 字节流可以传输任意文件数据 。在操作流的时候,我们要时刻明确, 无论使用什么样的流对象,底层传输的始终为二进制数据 。 2.2 字节输出流【OutputStream】 java.io.OutputStream 抽象类 是表示字节输出流的所有类的超类

例题3-2 WERTYU(WERTYU,UVa10082)

坚强是说给别人听的谎言 提交于 2020-02-17 05:17:55
原题链接: https://vjudge.net/problem/UVA-10082 分类:字符串 备注:常量数组 思路:用一个常量数组记录上键盘上的字符,根据输入的字符,如果不是空格和换行则选择数组中左侧字符输出。 代码如下: C++11可过 # include <stdio.h> # include <string.h> char s [ ] = { "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./" } ; int main ( void ) { int len = strlen ( s ) , flag [ 256 ] ; for ( int i = 0 ; i < len ; i ++ ) flag [ s [ i ] ] = i ; char ch ; while ( ~ scanf ( "%c" , & ch ) ) { if ( ch == ' ' || ch == '\n' ) printf ( "%c" , ch ) ; else printf ( "%c" , s [ flag [ ch ] - 1 ] ) ; } return 0 ; } 来源: CSDN 作者: Barsaker 链接: https://blog.csdn.net/TK_wang_/article/details/104348540

javascript高级程序设计--笔记01

谁说胖子不能爱 提交于 2020-02-15 11:40:30
概述 JavaScript的实现包含三个部分:   1 核心(ECMAScript) 提供核心语言功能   2 文档对象模型(DOM) 一套提供了访问以及操作网页内容的API   3 浏览器对象模型(BOM) 一套提供了与浏览器交互的API   ECMAScript 仅仅定义了这门语言的基础,如定义了:语法、类型、语句、关键字等,实际上这门语言本身不包含输入输出定义。   而现实中, ECMAScript 大多借用了某些宿主环境(如web浏览器,Node,Adobe Flash)来实现丰富的功能,这些宿主环境不仅提供了基本的 ECMAScript 实现,还提供了该语言的扩展(DOM BOM都是扩展之一),这些扩展利用 ECMAScript 的语法等提供更多具体的功能。   通过DOM,将html页面映射为一个多层的节点结构:整个html是一个根节点,根节点下分为head和body子节点,这两个子节点下的所有html标签都是一个又一个的子标签节点…… 通过使用DOM提供的属性或者方法我们可以快速锁定到每一个我们想要锁定的节点。   BOM则负责处理浏览器窗口和框架,如: 弹出浏览器窗口,移动、缩放、关闭浏览器窗口,cookies支持等等 ECMAScript --------------------------------------------------------<<<<<

string.h头文件以及stdio.h头文件下的sscanf和sprintf补充

a 夏天 提交于 2020-02-10 13:08:46
string.h头文件下的常用函数 strlen(字符数组的首地址):返回值是一个字符数组的大小(不包括\0) strlen(字符数组1,字符数组2):返回值分为三种情况 (1)1小于2,返回一个负整数 (2)1等于2,返回零 (3)1大于2,返回一个正整数 strcpy(字符数组1,字符数组2):把2复制给1,包括\0 strcat(字符数组1,字符数组2):把2接在1的后面 sscanf:把字符数组str中的内容以%d的格式写到n中(从左到右) # include <stdio.h> int main ( ) { int n ; double db ; char str2 [ 100 ] ; char str [ 100 ] = "2018:3.14,hello" ; sscanf ( str , "%d:%lf,%s" , & n , & db , str2 ) ; printf ( "n=%d,db=%.2f,str2=%s\n" , n , db , str2 ) ; } //n=2018,db=3.14,str2=hello sprintf:把n以%d的格式写到str字符数组中(从右到左) # include <stdio.h> int main ( ) { int n = 12 ; double db = 3.1415 ; char str [ 100 ] ;

c/c++

*爱你&永不变心* 提交于 2020-02-08 06:23:33
#c/c++ #####头文件 stdio.h c语言的标准输入输出,常用 printf;scanf iostream c++语言的标准输入输出,重用 cin;cout algorithm c++的常用算法头文件,如 sort;qsort #####数组处理 memcpy 数组a复制k个元素到数组b: memcpy(b,a,sizeof(int)*k); 数组a全部复制到数组b: memcpy(b,a,sizeof(a)); memset 数组a清0:``` memset(a,0,sizeof(a)); > >这里注意一点,memset对int数组赋初值时**只能赋值0**,其他数都不能赋值,++因为memset赋值的单位是字节,而int是4个字节,所以你赋值0,每字节都是0.所以合起来4个字节也是0,但是赋值其他的数,4个字节合起来就不是原来的数了++。(所以memset大多用来给char数组赋初值,因为char是一个字节) * #####数学计算 + pow >```pow(double a,double b);``` >头文件:```<math.h>``` > 功能:计算a的b次方 * #####字符处理 + sprintf >printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串 >```sprintf(a,"%d%d%d",a,b,c); ```/

[C语言]指针与字符串

随声附和 提交于 2020-02-07 20:49:53
----------------------------------------------------------------------------- // main.c // Created by weichen on 15/2/1. // Copyright (c) 2015年 weichen. All rights reserved. #include <stdio.h> int main(int argc, const char * argv[]) { /*   取地址与获取大小:   1. 运算符sizeof可以给出某个类型或变量在内存中的字节数 2. scanf("%d", &a);里面的&为运算符;&用于获取变量的地址,其操作数必须是变量 3. &不能对没有的东西取地址,如:&(a++),&(++a);取地址符右边必须有一个变量   */ int a = 0; int b = (int)&a; //将a的地址强制类型转换为整型 printf("sizeof(a)=%ld\n", sizeof(a)); //4 printf("sizeof(int)=%ld\n", sizeof(int)); //4 //4. double变量在内存中占据的空间是int变量的两倍 //5. 地址的大小是否与int相同取决于编译器,取决于是32位还是64位架构,并不总是相同

剑指offer (34)

拜拜、爱过 提交于 2020-02-07 00:34:51
题目 : 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 思路 : 1.遍历str,把字符存进一个数组中,数组下标和字符ASCII码相关 ,值代表频次。 2.再遍历一遍str,去数组中查找相对应的频次如何,如果=1,则返回,此时就是第一个只出现一次的字符。 public int FirstNotRepeatingChar ( String str ) { // a-z:65~90 A-Z:97 ~122 所以a~Z:共65位 int [ ] arr = new int [ 65 ] ; for ( int i = 0 ; i < str . length ( ) ; i ++ ) { int index = ( int ) str . charAt ( i ) - 65 ; if ( arr [ index ] == 0 ) { arr [ index ] = 1 ; } else { arr [ index ] ++ ; } } for ( int j = 0 ; j < str . length ( ) ; j ++ ) { int index = ( int ) str . charAt ( j ) - 65 ; if ( arr [ index ] == 1 ) {