[java实现]常见算法之字符串操作

一、字符串反转

把一个句子中的打次进行反转,比如“how are you” ,变为 “you are how”

// 字符串反转
public class StringTest {

    // 字符反转的方法
    private void swap(char[] c, int front, int end) {

        if (front > end || end >= c.length) {
            return;
        }

        while (front < end) {

            char tmp = c[front];
            c[front] = c[end];
            c[end] = tmp;

            front++;
            end--;
        }
    }

    // O(n)
    public String swapStr(String str) {

        char[] cArr = str.toCharArray();

        // 整个字符串的字符反转
        swap(cArr, 0, cArr.length - 1); // 反转整个字符串中的所有字母,how are you -> uoy era woh

        int begin = 0;

        // 对字符串中的每个单词反转,除了最后一单词
        for (int i = 0; i < cArr.length; i++) {

            if (cArr[i] == ‘ ‘) {
                swap(cArr, begin, i - 1);
                begin = i + 1;
            }
        }

        // 最后一个单词的反转
        swap(cArr, begin, cArr.length - 1);

        return new String(cArr);
    }

    public static void main(String[] args) {

        String str = "how are you";
        System.out.println(new StringTest().swapStr(str));
    }

}

二、判断字符串是否由相同的字符组成

判断连个字符串的字母个字母的个数是否一样,顺序可以不同, 如“aaaabc” 和“cbaaaa”是相同的

// 判断字符串是否由相同的字符组成
public class StringTest {

    // 方法一 可以死任意字符      O(nlogn)
    public boolean compareStr(String str1, String str2) {

        byte[] bs1 = str1.getBytes();
        byte[] bs2 = str2.getBytes();

        Arrays.sort(bs1);
        Arrays.sort(bs2);

        str1 = new String(bs1);
        str2 = new String(bs2);

        if (str1.equals(str2)) {
            return true;
        } else {
            return false;
        }
    }

    // 只能是ASCII码  方法二  O(n)
    public boolean compareStr2(String str1, String str2) {

        byte[] bs1 = str1.getBytes();
        byte[] bs2 = str2.getBytes();

        int bCount[] = new int[256];

        for (int i = 0; i < bs1.length; i++)
            bCount[bs1[i] ]++;
        for (int i = 0; i < bs2.length; i++)
            bCount[bs2[i] ]--;
        for (int i = 0; i < 256; i++) {

            if (bCount[i] != 0) {
                return false;
            }

        }
        return true;

    }

    public static void main(String[] args) {

        String str1 = "aaaabbc";
        String str2 = "cbaaaab";

        System.out.println(new StringTest().compareStr2(str1, str2));

    }

}

三、字符串中单词的统计

给定一段空格分开的字符串,判断单词的个数

// 字符串中单词的统计
public class StringTest {

    // O(n)
    public int wordCount(String str) {

        int word = 0;
        int count = 0;
        for (int i = 0; i < str.length(); i++) {

            if (str.charAt(i) == ‘ ‘)
                word = 0;
            else if (word == 0 ) {
                word = 1;
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {

        String str = "i am a good boy";

        System.out.println(new StringTest().wordCount(str));

    }

}

四、删除字符串中重复的字符

删除字符串中国重复的字符。如good -> god

// 删除字符串中重复的字符
public class StringTest {

    // O(n^2)
    public String removeDuplicate(String str) {

        char[] cs = str.toCharArray();
        int n = cs.length;

        for (int i = 0; i < n; i++) {

            if (cs[i] == ‘\0‘)
                continue;

            for (int j = i + 1; j < n; j++) {

                if (cs[j] == ‘\0‘)
                    continue;
                if (cs[i] == cs[j])
                    cs[j] = ‘\0‘;
            }
        }

        int be = 0;
        for (int i = 0; i < n; i++) {
            if (cs[i] != ‘\0‘)
                cs[be++] =cs[i];
        }

        return new String(cs, 0, be);
    }

    // 方法二: O(n)
    public String removeDuplicate2(String str) {

        char[] cs = str.toCharArray();
        int n = cs.length;

        int count[] = new int[256];
        for (int i = 0; i < cs.length; i++) {
            if (count[cs[i]] != 0)
                cs[i] = ‘\0‘;
            count[cs[i]]++;
        }

        int be = 0;
        for (int i = 0; i < n; i++) {
            if (cs[i] != ‘\0‘)
                cs[be++] = cs[i];
        }

        return new String(cs, 0, be);
    }

    public static void main(String[] args) {

        String str = "aaaabbc";

        System.out.println(new StringTest().removeDuplicate(str));

    }

}

五、按要求打印给定数组的排列情况

如1,2,2,3,4,5,要求第四位不为4,3和5不能相连

// 按要求打印数组的排列情况
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class StringTest {

    boolean visited[];
    String combination = "";
    int graph[][] = null;

    public void getAllCombination(int arr[]) {

        int n = arr.length;
        graph = new int[n][n];
        visited = new boolean[n];

        buildGraph(arr, graph);

        Set<String> set = new HashSet<>();

        for (int i = 0; i < n; i++) {
            depthFirstSearch(i, set, arr);
        }

        Iterator<String> iterator = set.iterator();

        while (iterator.hasNext()) {
            String string = (String) iterator.next();
            System.out.println(string);
        }
    }

    /**
     * 按照深度优先遍历 图,将符合要求的组合加入到set中,自动去重
     *
     * @param start
     * @param set
     * @param arr
     */
    private void depthFirstSearch(int start, Set<String> set, int arr[]) {
        visited[start] = true;
        combination += arr[start];

        if (combination.length() == arr.length) {
            if (combination.indexOf("4") != 2) {
                set.add(combination);
            }
        }

        for (int j = 0; j < arr.length; j++) {
            if (graph[start][j] == 1 && visited[j] == false)
                depthFirstSearch(j, set, arr);
        }

        // 什么意思?
        combination = combination.substring(0, combination.length() - 1);
        visited[start] = false;
    }

    /**
     * 根据传入的数构建一个图,图中的 3,5 不能相连
     *
     * @param arr
     * @param graph
     * @return
     */
    private int[][] buildGraph(int arr[], int[][] graph) {

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] == arr[j])
                    graph[i][j] = 0;
                else
                    graph[i][j] = 1;
            }
        }

        graph[3][5] = 0;
        graph[5][3] = 0;

        return graph;
    }

    public static void main(String[] args) {

        int arr[] = { 1, 2, 2, 3, 4, 5 };
        new StringTest().getAllCombination(arr);

    }

}

六、输出字符串的所有组合

给定一个字符串,输出该字符串中字符的所有组合

// 输出字符串的所有组合

public class StringTest {

    public void combineRecursive(char[] c, int begin, int len, StringBuffer sb) {

        if (len == 0) {
            System.out.print(sb + " ");
            return;
        }

        if (begin == c.length)
            return;
        sb.append(c[begin]);
        combineRecursive(c, begin + 1, len - 1, sb);
        sb.deleteCharAt(sb.length() - 1);
        combineRecursive(c, begin + 1, len, sb);

    }

    public static void main(String[] args) {

        String s = "abc";
        char[] cs = s.toCharArray();
        StringBuffer sb = new StringBuffer();

        for (int j = 1; j < cs.length; j++) {
            new StringTest().combineRecursive(cs, 0, j, sb);
        }
    }

}

原文地址:https://www.cnblogs.com/ytuan996/p/10679288.html

时间: 2024-10-15 22:01:56

[java实现]常见算法之字符串操作的相关文章

java入门(类型转换、字符串操作等)

java基础数据类型:不能=null; 四类八种: 整数型: byte   2的8次方 short   2的16次方 int   2的32次方 long   2的64次方 浮点型:    float    double   布尔型:    boolean(只有两个值, true, false)   字符型:    char   字符串:    String 类型转换:  隐式转换(我们看不到转换过程):  条件:   由低精度向高精度转换:    double 16位       1.22222

Java中String类(字符串操作)的10个常见问题和解决方法

注:来自百度搜索,还没有码一遍,一定要码!! 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比String更好?

简单整理常见对数组字符串操作的封装

.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 console.log(move([2,3,4,5,6,11,1,1,1,1,1,1,4,5,6],1)) function move(arr,item) { return arr.filter(function (arr) { return arr !== item }) } 查找数字类数组中最大值 console.log(maxArr([1,2,3,4,5]))function maxArr(

JavaScript中常见的起来字符串操作函数及用法

http://www.midifan.com/moduleuser-index-430717.htmhttp://www.midifan.com/moduleuser-index-430547.htmhttp://www.midifan.com/moduleuser-index-430688.htmhttp://www.midifan.com/moduleuser-index-430540.htmhttp://www.midifan.com/moduleuser-index-430836.htm

Java字符串操作及与C#字符串操作的不同

每种语言都会有字符串的操作,因为字符串是我们平常开发使用频率最高的一种类型.今天我们来聊一下Java的字符串操作及在某些具体方法中与C#的不同,对于需要熟悉多种语言的人来说,作为一种参考.进行诫勉 首先,什么是字符串? 字符串是字符的序列,是作为一种对象而存在.说的直白点,字符串就是一些字符的组合,从而构成字符串,例如“abc”就是字符串,"郭志奇"也是一种赐福穿. 我们知道,Java是一种面向对象的高级程序语言.所有事物均为对象,字符串也不例外,也是一种对象,其对应类型为String

java入门学习笔记之2(Java中的字符串操作)

因为对Python很熟悉,看着Java的各种字符串操作就不自觉的代入Python的实现方法上,于是就将Java实现方式与Python实现方式都写下来了. 先说一下总结,Java的字符串类String本身定义了一些简单的字符串操作, 字符串常用操作有: 1. 取某一字符第一次出现/最后一次出现的索引 2. 取字符串某一位置的字符 3. 字符串截取 4. 去除首尾空格 5. 字符串字符替换 6. 判断两个字符串是否相等 7. 大小写转换 下面开始: 1.取某一字符第一次出现/最后一次出现的索引 JA

数据结构——算法之(012)( linux C 所有字符串操作函数实现)

题目:实现linux C下常用的字符串操作函数 题目分析: 一.面试中可能经常遇到这样的问题:比如strcpy.memcpy.strstr 二.参考了linux 内核代码,对linux大神表示感谢,代码写得相当精致,这里拿来与大家分享吧 算法实现: /* * linux/lib/string.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * stupid library routines.. The optimized versions

C语言常见字符串操作函数总结

1. bcmp 原型:extern int bcmp(const void *s1, const void *s2, int n); 用法:#include <string.h> 功能:比较字符串s1和s2的前n个字节是否相等 说明:相等返回0,否则返回非0值 2. bcopy 原型:extern void bcopy(const void *src, const void *dest, int n); 用法:#include <string.h> 功能:将字符串src的前n个字节

java===java基础学习(4)---字符串操作

java中的字符串操作和python中的大致相同,需要熟悉的就是具体操作形式. 关于具体api的使用,详见:java===字符串常用API介绍(转) package testbotoo; public class shuzhileixingzhuanhuan { public static void main(String[] args){ String greeting = "hello word"; //string 类的substring 方法可以实现字符串的提取,提取一个子串.