Java中关于String字符串五种常见的算法题目

Posted IT-熊猫

tags:

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

1. 模拟一个trim方法,去除字符串两端的空格。

      /*
        1. 模拟一个trim方法,去除字符串两端的空格。
     */
    @Test
    public void test1()
        String s1 = " abc ";
//        System.out.println(s1);
        int start = s1.indexOf(" ");
        int end = s1.lastIndexOf(" ");
        String s2 = s1.substring(start+1,end);
        System.out.println(s2);
    

2. 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”

/*
        2. 将一个字符串进行反转。
        将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
     */
    @Test
    public void test2()
        String s1 = "abcdefg";
        String reverse = this.reverse(s1, 2, 5);
        System.out.println(reverse);
 
 
    
 
    //字符串指定字符反转,返回翻转后的字符串
    public String reverse(String str,int startIndex,int endIndex)
        char[] c1 = str.toCharArray();
        char temp;
        for (int i = startIndex,j = endIndex; i < endIndex ; i++,j--) 
            temp = c1[i];
            c1[i] = c1[j];
            c1[j] = temp;
        
        return new String(c1);
    

3. 获取一个字符串在另一个字符串中出现的次数。 比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数

   /*
    3. 获取一个字符串在另一个字符串中出现的次数。
比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
     */
    @Test
    public void test3()
        String s1 = "abkkcadkabkebfkabkskab";
        String s2 = "abababababababababababab";
        int num1 = times(s2, "ab");
        System.out.println(num1);
 
    
    // 获取一个字符串在另一个字符串中出现的次数。
    public int times(String str1,String str2) 
        int maxLen = str1.length();
        int minLen = str2.length();
        int index = 0;
        int count = 0;
        if (minLen < maxLen)
            while( (index = str1.indexOf(str2,index)) != -1)
                count++;
                index += minLen;
            
        
        return count;
    

4.获取两个字符串中最大相同子串。

 /*
    4.获取两个字符串中最大相同子串。比如:
str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"
提示:将短的那个串进行长度依次递减的子串与较长的串比较。
     */
    @Test
    public void test4()
        String str1 = "asdfgrgcihellonasdfj";
        String str2 = "hello";
        String str3 = getMaxSameString(str1,str2);
        System.out.println(str3);
    
    public String getMaxSameString(String str1,String str2) 
 
        //利用三目运算判断出字符串的长短
        String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
        String minStr = (str1.length() < str2.length()) ? str1 : str2;
 
        int minlength = minStr.length();//得到短字符串的长度
        for (int i = 0; i < minlength; i++) 
 
            for (int x = 0, y = minlength - i; y <= minlength; x++, y++) //保证循环中截取的字符串长度一样
                String subStr = minStr.substring(x, y);//截取字符串长度
                if (maxStr.contains(subStr)) //判断是否包含此字符串
                    return subStr;
                
            
 
        
        return null;
    

5.对字符串中字符进行自然顺序排序。

 @Test
    public void test5()
        String s1 = "wersdfgaeragsdgv";
        char[] c1 = s1.toCharArray();
        Arrays.sort(c1);
        String s2 = new String(c1);
        System.out.println(s2);
 
    

6.求一个字符串的所有排列

public class PermutationStr 
    private static void swap(char[] str,int i,int j)
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
    

    public static void permutation(char[] str,int start)
        if(str == null || start < 0)
            return;
        
        //完成全排列后输出当前排列的字符串
        if(start == str.length -1)
            System.out.println(str);
        else 
            for(int i = start; i < str.length; i++)
                //交换start与i所在位置字符
                swap(str,start,i);
                //固定第一个字符,对剩余的字符串进行全排列
                permutation(str,start+1);
                //还原start与i所在位置的字符
                swap(str,start,i);
            
        
    
    public static void permutation(String s)
        char[] str = s.toCharArray();
        permutation(str,0);
    

    public static void main(String[] args) 
        String s = "abc";
        permutation(s);
    


7.判断一个字符串是否包含重复字符

public class DupStr 
    public static boolean isDup(String str)
        int len = str.length();
        //只需要8个32位的int,8*32位=256位
        int[] flags = new int[8];
        int i;
        for(i = 0; i < 8; i++)
            flags[i] = 0;
        
        for(i = 0; i < len; i++)
            int index = (int)str.charAt(i)/32;
            int shift = (int)str.charAt(i)%32;
            if((flags[index] & (1 << shift)) != 0)
                return true;
            
            flags[index] |= (1 << shift);
        
        return false;
    

    public static boolean isDup1(String str)
        int len = str.length();
        int i,j;
        for(i = 0; i < len; i++)
            for(j = i + 1; j < len; j++)
                if(str.charAt(j) == str.charAt(i))
                    return true;
                
            
        
        return false;
    


8.如何判断两个字符串是否为换位字符串

换位字符串:指组成字符串的字符相同,但位置不同,如:“aaabbbccc”与“abcabcabc”

public static boolean compare(String s1,String s2)
        boolean result = true;
        //假设字符串只使用ASCII字符,共有256个(对应编码0—255)
        int[] count = new int[256];
        int i;
        for(i = 0; i < 256; i++)
            count[i] = 0;
        
        for(i = 0; i < s1.length(); i++)
            count[s1.charAt(i) - '0']++;
        
        for(i = 0; i < s2.length(); i++)
            count[s2.charAt(i) - '0']--;
        
        for(i = 0; i < 256; i++)
            if(count[i] != 0)
                result = false;
                break;
            
        
        return result;
    

以上是关于Java中关于String字符串五种常见的算法题目的主要内容,如果未能解决你的问题,请参考以下文章

面试题中关于String的常见操作

带你整理面试过程中关于 Redis 的五种数据类型

面试十大常见Java String问题

一文通数据结构与算法之——链表+常见题型与解题策略+Leetcode经典题

Java中关于string的些许问题及解析

Java中关于String类以及字符串拼接的问题