zoukankan      html  css  js  c++  java
  • 记录一下字符串处理的问题

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

      思路一:类似两个集合找相同元素一般,以一个集合为基准便利两个集合,遇到相同元素就中断,这样的时间代价是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!=''){
            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;
    }
    

     问题三:两端字符串,一个重排是否能成为另一个

      刚开始被传统思维束缚,第一个方案就是以一个为基准,重排另一个来判断。最后被吴军老师的书启发了,数据指纹->字符ASCII码->字符指纹恒定。所以看代码吧。

    	//重排字符串 --无论如何重排 字符串各元素相加是定值
    	public boolean reSort(String s1,String s2){
    		boolean enable=false;
    		int s1Count=0;
    		int s2Count=0;
    		if(s1.length()!=s2.length())
    			return enable;
    		else{
    			for(int i=0;i<s1.length();i++)
    			{
    				s1Count+=(int)s1.charAt(i);
    				s2Count+=(int)s2.charAt(i);
    				
    			}
    			if(s1Count==s2Count)
    				enable=true;
    				
    		}
    		
    		return enable;
    	}
    

    问题四: 替换字符串中的空格变为%20

      没啥方法,检测到空格就替换的意思。

        //替换字符串中的空格--空格编码 32
        public String replace(String s){
            String reS="";
            StringBuffer sbuild=new StringBuffer();
            int i=0;
            while(i<s.length()){
                char c=s.charAt(i);
                if(c!=' ')
                    sbuild.append(c);
                else{
                    sbuild.append("%20");
                }
                i++;
            }
    
            reS=sbuild.toString();
            
            return reS;
        }
  • 相关阅读:
    奶牛编号(Cowids) [NOIP模拟]
    天天爱跑步 [NOIP2016]
    部落冲突
    狡猾的商人 [HNOI2005] [一题双解]
    最长公共子序列-LCS问题 (LCS与LIS在特殊条件下的转换) [洛谷1439]
    LeetCode 2. Add Two Numbers
    LeetCode 1. Two Sum
    LeetCode 91. Decode Ways
    LeetCode 516. Longest Palindromic Subsequence
    什么是马拉车算法(Manacher's Algorithm)?
  • 原文地址:https://www.cnblogs.com/chentingk/p/5630228.html
Copyright © 2011-2022 走看看