记录一下字符串处理的问题

问题一:找出两串字符串是否存在相同字符。

  思路一:类似两个集合找相同元素一般,以一个集合为基准便利两个集合,遇到相同元素就中断,这样的时间代价是O(n2)平方级别,效率较低,也是最容易想到的方法。

public boolean StringSearch1(String s){
		boolean same=false;
		char[] chSet=new char[s.length()];
		s.getChars(0, s.length(), chSet, 0);
		for(int i=0;i<chSet.length;i++)
		{
			boolean bSignal=false;
			for(int j=0;j<chSet.length;j++)
			{
				if(j!=i)
					if(chSet[i]==chSet[j])
					{
						same=true;
						bSignal=true;
						break;
					}

			}
			if(bSignal)
				break;
		}

		return same;
	}

  思路二:利用java的map映射存储字符,遇到相同的key值比较value,并设置为相同后退出。map映射与散列表的思想是一样的,需要运用空间换取时间以达到O(n)的效率,但是另需O(n)的空间来存储。这是一个比较好的方法,不过随着数据量的增大会给存储服务带来很巨大的性能损耗。

	public boolean StringSearch2(String s)
	{
		boolean same=false;
		Map<Character, Boolean> map=new HashMap<Character, Boolean>();
		for(int i=0;i<s.length();i++)
		{
			if(map.get(s.charAt(i))==null)
				map.put(s.charAt(i), true);
			else
			{
				same=true;
				break;
			}
		}

		return same;
	}

  思路三:我们了解到有信息指纹这种简化信息本身存储空间的方法,并了解到通过信息指纹计算可以单独辨别一个信息,而且计算出来的指纹重复率十分之低。透过这个思想,我们想到每个字符都在系统中存在一个ASCII码,他们是互不相同的一个整形数(也可以说是二进制数),以此为基础建立A-Z,a-z的字典byte数组,然后以散列的方式存储并找出相同元素。(进一步优化就是位映射了,把一个byte=8个bit进行1变8的存储)。效率可达到O(n)。

//A-Z 65-90 a-z 97-122
	public boolean StringSearch3(String s)
	{
		boolean same=false;
		byte[] map =new byte[52];
		for(int i=0;i<map.length;i++)
			map[i]=0;
		for(int i=0;i<s.length();i++){
			char c=s.charAt(i);
			int code=(int)c;
			if(code<=90 && code>=65)
			{
				if(map[code-65]==1)
				{
					same=true;
					break;
				}else
					map[code-65]=1;
			}else if(code >=97 && code <=122)
			{
				if(map[code-97+26]==1){
					same=true;
					break;
				}else
					map[code-97+26]=1;
			}

		}
		return same;
	}

问题二:实现字符串反转

  在这个问题上我并没有能想到更好的方法,只有新建一个同等长度的字符串并对位转存。

	public String StringReserve1(String s) throws UnsupportedEncodingException
	{
		int length=s.length();
		byte[] b1=s.getBytes();
		byte[] b2=new byte[length];
		for(int i=0;i<length;i++){
			b2[i]=b1[length-i-1];

		}
		String reS=new String(b2,"utf-8");
		return reS;
	}
int LengthOfStr(const char *c){
    const char *p=c;
    int len=0;
    while(*p!=‘\0‘){
        len++;
        p++;
    }

    return len;
}
const char * reverseStr(const char *c){
    char* reverStr;
    int len=LengthOfStr(c);
    reverStr=new char(len);
    for(int i=0;i<len;i++)
        *(reverStr+i)=*(c+len-1-i);
    return reverStr;
}
时间: 2024-09-17 16:46:28

记录一下字符串处理的问题的相关文章

记录一个字符串出现的次数

首先定义一个计时器count= 0,然后判断父字符串中是否有子字符串,如果没有则直接返回count= 0,如果判断有,则定义一个变量index = 0  记录子字符串key出现的位置,然后生成一个新的字符串对象 str 利用substring()方法将其从index(index=0)+key.length位置截取生成一个新的字符串接着遍历,同时count++记录出现的次数. package cn.lyun.zzj; public class Test06 { public static void

Java遇见HTML——JSP篇之商品浏览记录的实现

一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 创建实体类(与数据库表一一对应) 创建业务逻辑类(DAO) 创建页面层 二.DBHelper类设计 1 package util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 6 public class D

Redis常用命令(一) 字符串键、散列键

redis是key-value的数据结构,每条数据都是一个键值对 键的类型是字符串,因为默认是字符串所以都不用加引号 注意:键不能重复 值的类型分为五种: 字符串string 散列hash 列表list 集合set 有序集合zset string字符串键 set key value  # 设置的键不存在则为添加,如果设置的键已经存在则修改 set name daiby set key value [NX|XX]  # NX: 如果key不存在则成功,反之失败(不覆盖旧值)! XX: 如果key存

hdu 2296 aC自动机+dp(得到价值最大的字符串)

Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3180    Accepted Submission(s): 1033 Problem Description For the hope of a forever love, Steven is planning to send a ring to Jane with a rom

Lua中字符串类型的源码实现

    概述 Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0.也就是说,可以将任意二进制数据存储到一个字符串中.Lua的字符串是不可变的值(immutable values).如果修改,实质上是新建一个字符串.根据上文<Lua中数据类型的源码实现>中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的.下面将通过Lua 5.2.1的源码来看字符串的实现以及总结了在Lua中使用字符串的注意事项.     源码实现 首

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

给定一个字符串,找到包含该字符串所有字符的最短子串

这题是豌豆荚二面的一个算法题,和leetcode的某些题目类似.其思路是这样的 首先遍历一次字符串,求出字符串不同字符的数目 为每一个字符保存一个列表,记录该字符在字符串中出现的索引:设置待求字符串为s(初始值为源串),记录待求字符串的首字母pStart(初始值为0) 重新遍历字符串,更新没有遍历的字符的数目,更新当前字符对应的索引列表.如果pStart处字符对应的列表长度大于1,则从索引列表中移出pStart,并将pStart加1,并重复该过程.如果剩余字符数目为0时,且子字符串[pStart

CSAPP Bomb Lab记录

记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编寻址模式要有清晰的了解,如mov指令涉及的是计算出的地址所指向的存储单元的值,而lea指令保留的是计算出来的地址,数字是否加$表示常数的问题等: 实验中涉及的跳表的存储方式.链表的处理等是C语言的汇编语言实现方式,处理起来较为复杂,但可对这些方式的对象底层实现方式有一个较为清晰的了解: 涉及指针操作

MySQL动态字符串处理DYNAMIC_STRING

MySQL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING. 为了记录动态字符串的实际长度,缓冲区的最大长度,以及每次字符串需要调整时,及时分配新的内存,以及调整长度.MySQL使用了DYNAMIC_STRING来保存动态字符串相关的信息: typedef struct st_dynamic_string { char *str; size_t length, max_length, alloc_increment; } DYNAMIC_STRING; 在这个结构体中,