Rumah > pembangunan bahagian belakang > C++ > Ubah suai rentetan secara minimum supaya semua subrentetan berbeza

Ubah suai rentetan secara minimum supaya semua subrentetan berbeza

王林
Lepaskan: 2023-09-04 14:49:07
ke hadapan
713 orang telah melayarinya

Ubah suai rentetan secara minimum supaya semua subrentetan berbeza

Rentetan ialah jenis objek tertentu yang mewakili jujukan dan aliran aksara data. Rentetan ialah bekas data, sentiasa diwakili dalam format teks. Ia juga digunakan untuk operasi konseptual, perbandingan, belah, gabungkan, ganti, potong, panjang, dalaman, kesamaan, perbandingan dan subrentetan. substring() ialah proses penapisan data yang mengekstrak data antara data yang disimpan dari awal hingga akhir. substring() tidak mengubah rentetan asal. Dalam set data, apabila kita mempunyai aksara yang berbeza, ia boleh diwakili sebagai elemen data yang berbeza. Contohnya: 'a' dan 'r' adalah berbeza, manakala 'r' dan 'r' adalah sama. Jadi, rentetan katakan, oren mengandungi 6 aksara yang berbeza. Begitu juga, epal rentetan mengandungi hanya 4 aksara yang berbeza.

Andaikan, "s" ialah rentetan, dan kita perlu mencari bilangan minimum perubahan yang diperlukan untuk semua subrentetan untuk menjadikan rentetan itu berbeza.

  • Panjang tali - 26

  • Input yang diberikan − T ialah kes ujian bagi baris pertama, iaitu integer. Untuk setiap kes ujian, hanya akan ada satu baris yang mengandungi 26 aksara.

  • Output - Kami akan mendapat bilangan perubahan minimum untuk setiap kes ujian.

  • Kekangan aliran kaedah logik

    • 1

    • 1

  • Dalam artikel hari ini, kita akan belajar cara mengubah suai rentetan supaya semua subrentetan berbeza.

Algoritma untuk membuat subrentetan berbeza

Ini adalah algoritma yang mungkin untuk beroperasi pada rentetan supaya semua subrentetan adalah berbeza sambil meminimumkan perubahan.

    Langkah pertama - mulakan.
  • Langkah 2 − Gunakan dua gelung bersarang untuk menjana subrentetan.
  • Langkah 3 - Gelung luar bermula dari i = 0 dan tolak panjang rentetan dengan 1.
  • Langkah 4 - Gelung dalam bermula dari j = 0 dan tolak panjang rentetan dengan 1.
  • Langkah 5 − Bina pembolehubah kiraan menggunakan nilai sifar.
  • Langkah 6− Di dalam gelung luar, cipta pembolehubah_ciri yang tersendiri.
  • Langkah 7 - Buat tatasusunan frekuensi.
  • Langkah 8− Tetapkan semua elemen sifar.
  • Langkah 9 - Semak sama ada kekerapan rentetan[j] - 'a' ialah sifar.
  • Langkah 10− Jika sifar, tambahkan 1.
  • Langkah 11− Jika tidak, pecahkannya menjadi gelung dalam.
  • Langkah 12 - Jika kiraan lebih besar daripada sifar, kembalikan kiraan.
  • Langkah 13 - Jika tidak, kembalikan -1.
  • Langkah 14 - Penamatan.
  • Sintaks untuk mencipta semua subrentetan berbeza
string.substring(start, end)
Salin selepas log masuk

Dalam sintaks ini kita dapat melihat cara membuat perubahan minimum pada rentetan supaya semua subrentetan adalah berbeza.

    Parameter
    • Mula - Kedudukan permulaan perlu diisytiharkan. Indeks aksara pertama di sini ialah 0.
    • Tamat − Ia adalah proses pilihan yang terletak di hujung (termasuk tetapi tidak terhad kepada).
    Kaedah

Kaedah 1− Cari bilangan minimum perubahan yang menjadikan semua subrentetan rentetan berbeza.

Cari bilangan minimum perubahan supaya semua subrentetan rentetan menjadi berbeza

Dalam kaedah ini, kita akan belajar cara membuat semua subrentetan berbeza. Di sini, setiap watak mesti berbeza. Kita hanya perlu mencari bilangan aksara. Jika panjang rentetan lebih daripada 26, maka kita hanya perlu menukarnya kepada rentetan. Di sini kita akan menulis logik yang sama di tempat yang berbeza.

Contoh 1: Menggunakan C++

#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26;
int minChanges(string &str) {
   int n = str.length();
   if (n > MAX_CHAR)
   return -1;
   int dist_count = 0;
   int count[MAX_CHAR] = {0};
   for (int i = 0; i < n; i++) {
      if (count[str[i] - 'a'] == 0)
      dist_count++;
      count[(str[i] - 'a')]++;
   }
   return (n - dist_count);
}
int main() {
   string str = "aebaecedabbeedee";
   cout << minChanges(str);
   return 0;
}
Salin selepas log masuk

Output

11
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Contoh 2: Dengan menggunakan Java

import java.lang.*;
import java.util.*;
public class tutorialspoint {
   static final int MAX_CHAR = 26;
   public static int minChanges(String str) {
      int n = str.length();
      if (n > MAX_CHAR)
      return -1;
      int dist_count = 0;
      int count[] = new int[MAX_CHAR];
      for(int i = 0; i < MAX_CHAR; i++)
      count[i] = 0;
      for (int i = 0; i < n; i++) {
         if(count[str.charAt(i)-'a'] == 0)
         dist_count++;
         count[str.charAt(i)-'a']++;
      }
      return (n-dist_count);
   }
   public static void main (String[] args) {
      String str = "aebaecedabbeedee";
      System.out.println(minChanges(str));
   }
}
Salin selepas log masuk

Output

11
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Contoh 1: Menggunakan Python

MAX_CHAR = [26]
def minChanges(str):

	n = len(str )
	if (n > MAX_CHAR[0]):
		return -1
	dist_count = 0
	count = [0] * MAX_CHAR[0]

	for i in range(n):
		if (count[ord(str[i]) - ord('a')] == 0) :
			dist_count += 1
		count[(ord(str[i]) - ord('a'))] += 1
	return (n - dist_count)
if __name__ == '__main__':
	str = "aebaecedabbeedee"
	print(minChanges(str))
	
Salin selepas log masuk

Output

11
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kesimpulan

Hari ini, dalam artikel ini, kami belajar cara membuat semua subrentetan berbeza dengan perubahan yang minimum. Di sini kami telah mencipta beberapa kod yang mungkin dengan mengikuti algoritma yang diterangkan dalam C++, Java dan Python. Semoga ini membantu anda memperoleh pemahaman yang lebih menyeluruh tentang subjek tersebut.

Atas ialah kandungan terperinci Ubah suai rentetan secara minimum supaya semua subrentetan berbeza. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan