


Program C++: cari urutan nombor terpanjang dengan putaran kiri dan kanan yang sama
Dalam masalah ini, kita perlu mencari panjang maksimum urutan dengan putaran kiri dan kanan yang sama. Putaran kiri bermaksud memindahkan semua aksara dalam rentetan ke kiri, dan menggerakkan aksara pertama pada penghujungnya. Putaran kanan bermaksud memindahkan semua aksara rentetan ke kanan dan mengalihkan aksara terakhir ke permulaan.
Pernyataan Masalah – Kami diberi rentetan str yang mengandungi nombor dan perlu mencari urutan panjang maksimum dengan putaran kiri dan kanan yang sama.
Contoh
Masukkan -str="323232",
Output– 6
Penjelasan - Susunan terpanjang dengan pusingan kiri dan kanan yang sama ialah "323232". Putar ke kiri ke '232323' dan putar ke kanan ke '232323'.
Masukkan -str = ‘00010100’
Output– 6
Penjelasan – Susunan terpanjang dengan putaran kiri dan kanan yang sama ialah "000000".
Masuk -str = ‘092312110431010’
Output– 6
Penjelasan – Terdapat 2 kemungkinan urutan panjang 6 dengan putaran kiri dan kanan yang sama. Yang pertama ialah "010101" dan yang kedua ialah "101010".
Kaedah 1
Dalam kaedah ini kita akan menemui semua kemungkinan urutan rentetan yang diberikan. Selepas itu kita akan menyemak sama ada putaran kiri dan kanan rentetan adalah sama. Kami akan menggunakan kaedah rekursif untuk mencari semua kemungkinan susulan.
Algoritma
Mulakan pembolehubah global "maxLen" kepada sifar untuk menyimpan panjang urutan terpanjang yang sama untuk putaran kiri dan kanan.
Tentukan fungsi isRightSameLeft() untuk menyemak sama ada putaran kiri dan kanan rentetan adalah sama.
Di dalam fungsi, gunakan kaedah substr() untuk memutar rentetan ke kiri dan kanan.
getAllSubSeq() digunakan untuk mencari semua kemungkinan urutan rentetan yang diberikan.
Tentukan kes asas. Jika str kosong, kita mendapat urutan dan laksanakan fungsi isRightSameLeft() untuk menyemak sama ada jujukan mempunyai putaran kiri dan kanan yang sama. Jika ya, kemas kini nilai pembolehubah "maxLen" jika panjangnya lebih besar daripada nilai semasa "maxLen".
Buat panggilan rekursif selepas mengalih keluar aksara pertama daripada "str" dan menambahkan rentetan "keluar".
Selepas mengalih keluar aksara pertama dan membiarkan rentetan "keluar" tidak berubah, buat satu lagi panggilan fungsi rekursif. Dalam panggilan rekursif ini, kami mengecualikan aksara pertama "str".
Contoh
#include <iostream> #include <string> using namespace std; // Defining global variable to store the length of the longest subsequence according to the given condition int maxLen = 0; // function to check if the string is the same after the left rotation bool isRightSameLeft(string str) { int len = str.length(); return str.substr(1, len - 1) + str[0] == str[len - 1] + str.substr(0, len - 1); } // function to get all subsequences of a string void getAllSubSeqs(string str, string out) { // If the string is empty, we get the subsequences. Check if its left and right rotation is the same if (str.empty()) { if (isRightSameLeft(out)) maxLen = max(maxLen, (int)out.length()); return; } // Recursive case remove the first character from str, and add it to the output getAllSubSeqs(str.substr(1), out + str[0]); // remove the first character from str, and drop it if (str.length() > 1) getAllSubSeqs(str.substr(1), out); } int main() { string str = "323232"; string out = ""; getAllSubSeqs(str, out); cout << "The longest subsequence of str having same left and right rotation is " << maxLen; return 0; }
Output
The longest subsequence of str having same left and right rotation is 6
Kerumitan masa - O(N*2N). Di sini O(N) untuk membandingkan putaran kiri dan kanan dan O(2N) untuk mencari semua kemungkinan susulan.
Kerumitan ruang - O(1) kerana kami tidak menggunakan ruang tambahan.
Kaedah 2
Di sini, kami telah mengoptimumkan kaedah di atas. Kita boleh melihat penyelesaian input sampel. Putaran kiri dan kanan bagi suatu urutan adalah sama hanya jika urutan tersebut mengandungi aksara yang sama atau secara berselang-seli mengandungi dua aksara yang berbeza dan mempunyai panjang genap.
Algoritma
Gunakan dua gelung bersarang untuk menggabungkan mana-mana dua nombor.
Takrifkan pembolehubah 'cnt' untuk mencari panjang urutan yang mengandungi dua nombor secara berselang-seli, dan mulakannya kepada sifar.
Tentukan pembolehubah "pertama" boolean untuk menjejaki sama ada aksara seterusnya harus menjadi aksara ke-i atau ke-j.
Gunakan gelung untuk melintasi rentetan.
Jika dahulu == benar dan str[k] - '0' == I, gantikan nilai 'first' dan tambahkan 'cnt' sebanyak 1.
Jika dahulu == false dan str[k] - '0' == j, gantikan nilai 'first' sekali lagi dan tambahkan 'cnt' sebanyak 1.
Jika i dan j tidak sama dan nilai "cnt" adalah ganjil, kurangkan ia sebanyak 1.
Jika nilai cnt lebih besar daripada "res", kemas kini nilai pembolehubah "res".
Contoh
#include <bits/stdc++.h> using namespace std; int getLongSubSeq(string str) { // Store the length of the string int len = str.size(), res = 0; // Traverse the all possible combination of two digits for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // to store the length of an alternating sequence of the current combination int cnt = 0; // to track the turn of the ith or jth digit bool first = true; // traverse the string for (int k = 0; k < len; k++) { // If the current digit is equal to I, and the first is true, increment the count if (first == true and str[k] - '0' == i) { first = false; cnt++; } else if (first == false and str[k] - '0' == j) { // If the current digit is equal to j, and the first is false, increment the count first = true; cnt++; } } // If the sequence is odd and i and j are different, decrement the count if (i != j and cnt % 2 == 1) cnt--; // Update the answer res = max(cnt, res); } } return res; } int main() { string str = "00010100"; cout << "The longest subsequence of str having same left and right rotation is " << getLongSubSeq(str); return 0; }
Output
The longest subsequence of str having same left and right rotation is 6
Kerumitan masa - O(10*10*N) kerana kita menemui urutan daripada rentetan yang mengandungi gabungan nombor.
Kerumitan ruang - O(1) kerana kami tidak menggunakan ruang dinamik.
Tutorial ini mengajar kita dua kaedah untuk mencari urutan terpanjang yang mengandungi putaran kiri dan kanan yang sama. Kaedah pertama ialah kaedah mudah, kaedah ini sangat memakan masa dan kami tidak boleh menggunakannya untuk jumlah input yang banyak.
Kaedah kedua dioptimumkan dan kerumitan masanya hampir sama dengan O(N).
Atas ialah kandungan terperinci Program C++: cari urutan nombor terpanjang dengan putaran kiri dan kanan yang sama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Sebagai platform perkongsian gaya hidup, Xiaohongshu adalah tempat semakin ramai pengguna memilih untuk menerbitkan kandungan video mereka sendiri dan berkongsi kehidupan harian mereka dengan pengguna lain. Ramai pengguna mungkin menghadapi masalah semasa menyiarkan video: Bagaimana untuk menyemak masa apabila mereka atau orang lain menyiarkan video? 1. Bagaimana untuk menyemak masa apabila Xiaohongshu mengeluarkan video? 1. Semak masa anda menyiarkan video Untuk menyemak masa anda menyiarkan video, anda mesti membuka aplikasi Xiaohongshu dan log masuk ke akaun peribadi anda. Di bahagian bawah antara muka laman utama peribadi, akan ada pilihan bertanda "Penciptaan". Selepas mengklik untuk masuk, anda akan melihat lajur yang dipanggil "Video". Di sini anda boleh menyemak imbas senarai semua video yang diterbitkan dan menyemak dengan mudah apabila ia diterbitkan. Terdapat butang "Lihat Butiran" di sudut kanan atas setiap video Selepas mengklik

Siap sedia ialah mod skrin kunci yang diaktifkan apabila iPhone dipalamkan ke dalam pengecas dan berorientasikan dalam orientasi mendatar (atau landskap). Ia terdiri daripada tiga skrin berbeza, satu daripadanya dipaparkan masa skrin penuh. Teruskan membaca untuk mengetahui cara menukar gaya jam anda. Skrin ketiga StandBy memaparkan masa dan tarikh dalam pelbagai tema yang boleh anda leret secara menegak. Sesetengah tema juga memaparkan maklumat tambahan, seperti suhu atau penggera seterusnya. Jika anda menahan sebarang jam, anda boleh bertukar antara tema yang berbeza, termasuk Digital, Analog, Dunia, Suria dan Terapung. Terapung memaparkan masa dalam nombor gelembung besar dalam warna yang boleh disesuaikan, Solar mempunyai fon yang lebih standard dengan reka bentuk suar matahari dalam warna yang berbeza, dan Dunia memaparkan dunia dengan menyerlahkan

Mewakili nombor sebagai output adalah tugas yang menarik dan penting apabila menulis program dalam mana-mana bahasa. Untuk jenis integer (data jenis pendek, panjang atau sederhana), mudah untuk mewakili nombor sebagai output. Untuk nombor titik terapung (jenis terapung atau berganda), kadangkala kita perlu membundarkannya kepada nombor tempat perpuluhan tertentu. Sebagai contoh, jika kita ingin mewakili 52.24568 sebagai tiga tempat perpuluhan, beberapa prapemprosesan diperlukan. Dalam artikel ini, kami akan memperkenalkan beberapa teknik untuk mewakili nombor titik terapung kepada nombor tempat perpuluhan tertentu dengan membundarkan. Antara pendekatan yang berbeza, adalah penting untuk menggunakan rentetan format seperti C, menggunakan hujah ketepatan dan menggunakan fungsi round() daripada perpustakaan matematik. Mari kita lihat mereka satu persatu. dengan

Keupayaan untuk menjana nombor rawak atau rentetan alfanumerik berguna dalam banyak situasi. Anda boleh menggunakannya untuk melahirkan musuh atau makanan di lokasi yang berbeza dalam permainan. Anda juga boleh menggunakannya untuk mencadangkan kata laluan rawak kepada pengguna atau mencipta nama fail untuk menyimpan fail. Saya menulis tutorial tentang cara menjana rentetan alfanumerik rawak dalam PHP. Saya berkata pada permulaan siaran ini bahawa beberapa peristiwa benar-benar rawak, dan perkara yang sama berlaku untuk nombor rawak atau penjanaan rentetan. Dalam tutorial ini, saya akan menunjukkan kepada anda cara menjana rentetan alfanumerik pseudo-rawak dalam JavaScript. Menjana Nombor Rawak dalam JavaScript Mari mulakan dengan menjana nombor rawak. Kaedah pertama yang terlintas di fikiran ialah Math.random(), yang mengembalikan apungan

Kita semua tahu nombor yang bukan kuasa dua mana-mana nombor, seperti 2, 3, 5, 7, 8, dll. Terdapat N nombor bukan persegi, dan adalah mustahil untuk mengetahui setiap nombor. Jadi, dalam artikel ini, kami akan menerangkan segala-galanya tentang nombor tanpa kuasa dua atau bukan kuasa dua dan cara untuk mencari nombor bukan kuasa dua N dalam C++. Nombor bukan kuasa dua ken Jika nombor ialah kuasa dua integer, maka nombor itu dipanggil kuasa dua sempurna. Beberapa contoh nombor kuasa dua sempurna ialah -1isquareof14issquareof29issquareof316issquareof425issquareof5 Jika nombor bukan kuasa dua mana-mana integer, maka nombor itu dipanggil bukan kuasa dua. Sebagai contoh, 15 nombor bukan kuasa dua yang pertama ialah -2,3,5,6,

Dalam bahasa pengaturcaraan PHP, fungsi is_numeric() ialah fungsi yang sangat biasa digunakan, digunakan untuk menentukan sama ada pembolehubah atau nilai ialah nombor. Dalam pengaturcaraan sebenar, selalunya perlu untuk mengesahkan nilai yang dimasukkan oleh pengguna untuk menentukan sama ada ia adalah jenis angka Dalam kes ini, fungsi is_numeric() boleh digunakan untuk menentukan. 1. Pengenalan kepada fungsi is_numeric() Fungsi is_numeric() ialah fungsi yang digunakan untuk mengesan sama ada pembolehubah atau nilai ialah nombor. Mengembalikan tru jika pembolehubah atau nilai ialah nombor

Dalam artikel ini, kita akan membincangkan masalah mencari nombor antara 1 dan n (diberi) yang tidak boleh dibahagikan dengan sebarang nombor antara 2 dan 10. Mari kita fahami ini dengan beberapa contoh - Input:num=14Output:3Penjelasan:Terdapat tiga nombor,1,11,dan13,yang tidak boleh dibahagikan.Input:num=21Output:5Penjelasan:Terdapat nombor1,11,13,17,dan19,yang tidak boleh dibahagi jika

Nombor dalam Java Adalah penting untuk memahami bahawa kelas nombor bukanlah kelas nyata tetapi kelas abstrak. Di dalamnya, kami mempunyai satu set kelas pembalut yang mentakrifkan fungsinya. Kelas pembalut ini termasuk Integer, Byte, Double, Short, Float dan Long. Anda mungkin perasan bahawa ini adalah jenis data asas yang sama yang kita bincangkan sebelum ini, tetapi ia diwakili sebagai kelas berasingan dengan nama huruf besar untuk mematuhi konvensyen penamaan kelas. Pengkompil secara automatik menukar jenis data primitif kepada objek dan sebaliknya seperti yang diperlukan untuk fungsi atau skop program tertentu, dan kelas berangka adalah sebahagian daripada pakej java.lang. Proses ini dipanggil autoboxing dan unboxing. Dengan memahami sifat abstrak kelas angka dan kelas pembalut yang sepadan, kita boleh
