程序员社区

String类课后算法题目

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

package exer;

import org.junit.Test;

public class StringDemo {

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

    方式一:转换为char[]
     */
    public String reverse(String str,int startIndex,int endIndex){

        if(str != null){
            char[] arr = str.toCharArray();//将string类型转换为字符数组
            for(int x = startIndex,y = endIndex;x < y;x++,y--){
                char temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
            }

            return new String(arr);
        }
        return null;
    }

    //方式二:使用String的拼接
    public String reverse1(String str,int startIndex,int endIndex){
        if(str != null){
            //第1部分
            String reverseStr = str.substring(0,startIndex);//取出ab
            //第2部分
            for(int i = endIndex;i >= startIndex;i--){
                reverseStr += str.charAt(i);
            }
            //第3部分
            reverseStr += str.substring(endIndex + 1);//加上末尾的字母

            return reverseStr;

        }
        return null;
    }
    //方式三:使用StringBuffer/StringBuilder替换String
    public String reverse2(String str,int startIndex,int endIndex){
        if(str != null){
            StringBuilder builder = new StringBuilder(str.length());

            //第1部分
            builder.append(str.substring(0,startIndex));
            //第2部分
            for(int i = endIndex;i >= startIndex;i--){
                builder.append(str.charAt(i));
            }
            //第3部分
            builder.append(str.substring(endIndex + 1));

            return builder.toString();//将StringBuilder转化为String类型
        }
        return null;

    }

    @Test
    //测试方法
    public void testReverse(){
        String str = "abcdefg";
        String reverse = reverse2(str, 2, 5);
        System.out.println(reverse);//abfedcg
    }

}

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

package exer;

import org.junit.Test;

public class StringDemo1 {
    /*
    获取一个字符串在另一个字符串中出现的次数。
      比如:获取“ab”在 “abkkcadkabkebfkaabkskab” 中出现的次数

     */

    /**
     * 获取subStr在mainStr中出现的次数
     * @param mainStr 主字符串
     * @param subStr  检索字符串 ab
     * @return
     */
    public int getCount(String mainStr,String subStr){
        int mainLength = mainStr.length();
        int subLength = subStr.length();
        int count = 0;
        int index = 0;
        if(mainLength >= subLength){
            //方式一:
//            while((index = mainStr.indexOf(subStr)) != -1){
//                count++;
//                mainStr = mainStr.substring(index + subStr.length());
//               返回的索引位置加上subStr字符串的长度,截取 此之后的字串,接着寻找,
//               此处会造成效率降低,因为不断的在造新的对象。
//            }
            //方式二:对方式一的改进
            while((index = mainStr.indexOf(subStr,index)) != -1){
               //返回此子字符串在此字符串种第一次出现处的索引,从指定的索引开始。
                count++;
                index += subLength;
            }

            return count;
        }else{//如果mainLength 小于 subLength,那就不可能包含了只能返回0了。
            return 0;
        }
    }

    @Test
    public void testGetCount(){
        String mainStr = "abkkcadkabkebfkaabkskab";
        String subStr = "ab";
        int count = getCount(mainStr, subStr);
        System.out.println(count);
    }
}

获取两个字符串中最大相同子串。比如: str1 = “abcwerthelloyuiodefabcdef”;str2 = “cvhellobnm”

package exer;

import org.junit.Test;

import java.util.Arrays;

public class StringDemo2 {
    /*
    获取两个字符串中最大相同子串。比如:
   str1 = "abcwerthelloyuiodefabcdef";str2 = "cvhellobnm"
   提示:将短的那个串进行长度依次递减的子串与较长的串比较。

         */
    //☆前提:两个字符串中只有一个最大相同子串
    public String getMaxSameString(String str1,String str2){
        if(str1 != null && str2 != null){
            String maxStr = (str1.length() >= str2.length())? str1 : str2;
            String minStr = (str1.length() < str2.length())? str1 : str2;
            int length = minStr.length();
          //外层循环控制取子串的长度(个数),内层控制取子串的位置(从头部开始每次向后移动一位)
            for(int i = 0;i < length;i++){
                for(int x = 0,y = length - i;y <= length;x++,y++){
                    String subStr = minStr.substring(x,y);//substring是前闭后开的,所以可以取到length
                    if(maxStr.contains(subStr)){
                        return subStr;
                    }

                }
            }

        }
        return null;
    }

    // ☆如果存在多个长度相同的最大相同子串
    // 此时先返回String[],后面可以用集合中的ArrayList替换,较方便
    public String[] getMaxSameString1(String str1, String str2) {
        if (str1 != null && str2 != null) {
            StringBuffer sBuffer = new StringBuffer();
            String maxString = (str1.length() > str2.length()) ? str1 : str2;
            String minString = (str1.length() > str2.length()) ? str2 : str1;

            int len = minString.length();
            for (int i = 0; i < len; i++) {
                for (int x = 0, y = len - i; y <= len; x++, y++) {
                    String subString = minString.substring(x, y);
                    if (maxString.contains(subString)) {
                        sBuffer.append(subString + ",");//添加subString 和 ","
                    }
                }
                //上边判断8, 7的时候,没找到,下面length为0,出不去,判断6个字母的时候,
                // 找到了,就不用判断5个的了,因为要选出最长的,所以直接退出break就行了。
                if (sBuffer.length() != 0) {
                    break;
                }
            }
            //先转换为String类型,再如果是",$" ,即以逗号结尾就去掉它,然后再以逗号分割。
            String[] split = sBuffer.toString().replaceAll(",$", "").split("\\,");
            return split;
        }

        return null;
    }

    @Test
    public void testGetMaxSameString(){
        String str1 = "abcwerthello1yuiodefabcdef";
        String str2 = "cvhello1bnmabcdef";
        String[] maxSameStrings = getMaxSameString1(str1, str2);
        System.out.println(Arrays.toString(maxSameStrings));//[hello1, abcdef]

    }

}

赞(0) 打赏
未经允许不得转载:IDEA激活码 » String类课后算法题目

一个分享Java & Python知识的社区